desde - Cómo devolver XML en ASP.NET
consumir wcf desde ajax (4)
Usar System.Xml (o System.Xml.Linq) sería menos sobrecarga en términos de hacer las cosas bien que la codificación manual Response.Write y asegurarse de citar todo lo que necesita, ordenar la codificación, etc. ¿Por qué querría ¿reinventar la rueda?
Cree una nueva página ashx en lugar de aspx, cree el XmlDocument / XDocument apropiado y escríbalo en la respuesta, estableciendo el tipo de contenido de manera apropiada.
Vea este artículo para un ejemplo creando una fuente RSS. Es el mismo tipo de cosas que hago en mi sitio para generar RSS desde la base de datos. Usar LINQ a XML crea todo el documento en una única declaración (ciertamente grande pero legible). Entonces solo se trata de establecer el tipo de contenido y el context.Response.Write(doc)
. Muy simple.
Esta es una pregunta muy básica. Solo estoy en mi misión de aprender ASP.NET (C #). He hecho clásicos ASP y PHP antes.
Para este proyecto, tengo ASP.NET 2.0 en mis manos.
Tengo un Formulario web que tiene una cuadrícula de datos jqGrid que quiero alimentar datos XML a través de AJAX. jqGrid no es el problema aquí, sin embargo. El "problema" es el enfoque que debería tomar para generar el XML.
¿Cómo hago eso en ASP.NET?
- ¿Creo un nuevo formulario web que genere esos datos?
- ¿Utilizo un nuevo servicio web (que no devolvería el XML que necesito, ¿o sí?)?
- ¿De alguna manera pongo una función en el formulario web existente que muestra la tabla? ¿Si es así, cómo?
Después de que se toma la decisión: ¿Cómo puedo generar el XML? No quiero usar ningún componente XML de ASP.NET, porque es un XML simple y simplificado con un registro después de otro. Usar System.Xml sería demasiada sobrecarga para justificarse aquí.
<?xml version=''1.0'' encoding=''utf-8''?>
<rows>
<page>1</page>
<total>25</total>
<records>3</records>
<row id=''1''>
<cell>Row 1, Column 1</cell>
<cell>Row 1, Column 2</cell>
<cell>Row 1, Column 3</cell>
</row>
<row id=''2''>
<cell>Row 2, Column 1</cell>
<cell>Row 2, Column 2</cell>
<cell>Row 2, Column 3</cell>
</row>
<row id=''3''>
<cell>Row 3, Column 1</cell>
<cell>Row 3, Column 2</cell>
<cell>Row 3, Column 3</cell>
</row>
</rows>
De mi experiencia anterior con los otros lenguajes de scripting, me gustaría imprimir una secuencia de etiquetas XML (Response.Write). ¿Me iré al infierno si lo hago en ASP.NET?
Hm, me gustaría repartir dos "respuestas aceptadas". ;)
Jon Skeet respondió la primera parte de mi pregunta:
Crea un nuevo ashx en lugar de la página aspx
Así que creé un controlador genérico que es lo que estaba buscando.
Matthew Pelser respondió la segunda parte de mi pregunta:
utilice el XmlWriter, una especie de solución intermedia entre la creación manual del xml como una cadena y el uso de un dom.
Así que he usado el XmlWriter, que es lo que estaba buscando.
Otra solución para usar un XmlDocument / Linq completo en el ashx es usar el XmlWriter, una especie de solución a mitad de camino entre la elaboración manual del xml como una cadena y el uso de un dom.
Algo como:
StringBuilder query = new StringBuilder();
using (XmlWriter xmlWriter = XmlWriter.Create(query))
{
xmlWriter.WriteStartElement("rows");
xmlWriter.WriteElementString("page", "1");
foreach(...)
{
xmlWriter.WriteStartElement("rows");
xmlWriter.WriteAttributeString("row", "1");
foreach(...)
{
xmlWriter.WriteElementString("cell", "Row 1, Column 1");
}
xmlWriter.WriteEndElement();
}
xmlWriter.WriteEndElement();
}
ejemplo de trabajo de test.ashx:
<%@ WebHandler Class="XMLHandler" %>
Imports System.Xml
Public Class XMLHandler : Implements IHttpHandler
Public Sub ProcessRequest(ByVal context as HttpContext) Implements IHttpHandler.ProcessRequest
context.Response.ContentType = "text/xml"
Dim input as string = context.Request.Params("input")
Dim settings as new XmlWriterSettings()
settings.Indent = false
Using xml as XmlWriter = XmlWriter.Create(context.Response.Output, settings)
xml.WriteStartDocument
xml.WriteStartElement("wsis")
xml.WriteAttributeString("id","p4")
xml.WriteElementString("user_id", "test")
xml.WriteEndElement()
xml.WriteEndDocument()
End Using
End Sub
Public ReadOnly Property IsReusable() as Boolean Implements IHttpHandler.IsReusable
Get
Return True
End Get
End Property
End Class