Как вернуть XML в ASP.NET - PullRequest
       36

Как вернуть XML в ASP.NET

1 голос
/ 17 декабря 2008

Это очень простой вопрос. Я только на моей миссии изучать ASP.NET (C #). Я делал классические ASP и PHP раньше.

Для этого проекта у меня в руках ASP.NET 2.0 .

У меня есть веб-форма, в которой есть jqGrid Datagrid, для которого я хочу передавать данные XML через AJAX. JQGrid здесь не проблема, хотя. «Проблема» - это подход, который я должен использовать для генерации XML.

Как мне это сделать в ASP.NET?

  • Создать ли новую веб-форму, которая генерирует эти данные?
  • Пользуюсь ли я новым веб-сервисом (который не возвращает нужный мне XML, не так ли?)?
  • Должен ли я как-то поместить функцию в существующую веб-форму, которая показывает таблицу? Если да, то как?

После того, как принято это решение: как вывести XML? Я не хочу использовать какие-либо XML-компоненты ASP.NET, потому что это простой, упрощенный XML с одной записью за другой. Использование System.Xml было бы слишком сложным, чтобы оправдываться здесь.

<?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>

Из моего предыдущего опыта работы с другими языками сценариев я просто хотел бы распечатать поток тегов XML (Response.Write). Пойду ли я к черту, если я сделаю это в ASP.NET?

Ответы [ 4 ]

7 голосов
/ 17 декабря 2008

Использование System.Xml (или System.Xml.Linq) будет менее затратным с точки зрения правильной настройки, чем ручное кодирование Response.Write и проверка того, что вы цитируете все, что вам нужно, сортировку кодировки и т. Д. Почему Вы хотите изобрести велосипед?

Создайте новый ashx вместо aspx-страницы, создайте соответствующий XmlDocument / XDocument и запишите его в ответ, правильно установив тип содержимого.

См. эту статью для примера создания RSS-канала. Это то же самое, что я делаю на своем сайте, чтобы генерировать RSS из базы данных - используя LINQ to XML, это создает весь документ в одном (по общему мнению, большом, но читаемом) утверждении. Тогда это просто случай установки типа контента и вызова context.Response.Write(doc). Очень просто.

4 голосов
/ 17 декабря 2008

Другое решение для использования полноценного XmlDocument / Linq в ashx - это использование XmlWriter, своего рода промежуточного решения между ручной обработкой xml в виде строки и использованием dom.

Что-то вроде:

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();
}
1 голос
/ 17 декабря 2008

Хм, я бы хотел раздать два "принятых ответа". ;)

Джон Скит ответил на первую часть моего вопроса:

Создайте новый ясень вместо страницы aspx

Итак, я создал универсальный обработчик, который я искал.

Мэтью Пелсер ответил на вторую часть моего вопроса:

используйте XmlWriter, своего рода решение на полпути между ручной обработкой xml в виде строки и использованием dom.

Итак, я использовал XmlWriter, который я искал.

0 голосов
/ 27 января 2016

рабочий пример 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...