Как добавить новые элементы в Xml из потока - PullRequest
4 голосов
/ 20 марта 2010

У меня есть метод, который возвращает XML в потоке памяти

private MemoryStream GetXml()
{
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;

    using (MemoryStream memoryStream = new MemoryStream())
    {
        using (XmlWriter writer = XmlWriter.Create(memoryStream, settings))
        {
            writer.WriteStartDocument();
            writer.WriteStartElement("root");
            writer.WriteStartElement("element");
            writer.WriteString("content");
            writer.WriteEndElement();
            writer.WriteEndElement();
            writer.WriteEndDocument();
            writer.Flush();
        }

        return memoryStream;
    }
}

В этом примере формат xml будет:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <element>content</element>
</root>

Как вставить новый элемент в корень, например ::1007 *

<?xml version="1.0" encoding="utf-8"?>
<root>
  <element>content</element>
  ----->New element here <------
</root>

EDIT:

Также, пожалуйста, предложите наиболее эффективный метод, так как возврат MemoryStream может быть не лучшим решением.

Окончательный xml будет передан в пользовательский HttpHandler, так каковы наилучшие варианты для записи вывода?

context.Response.Write против context.Response.OutputStream

Ответы [ 2 ]

3 голосов
/ 20 марта 2010

Ваша первая проблема в том, что у вас нет XML - у вас есть поток байтов, который можно загрузить в XDocument или XmlDocument.Вам действительно нужно выводить в поток, а не прямо в XML-документ?

Кстати, я думаю, вам нужно потерять блок using вокруг MemoryStream.Вы не сможете использовать поток в течение длительного времени после его утилизации.

public void AppendElement()
{
    XDocument doc;
    using(MemoryStream stream = GetXml())
    {
        using(var sr = new StreamReader(stream))
        {
            doc = XDocument.Load(sr);
        }
    }
    if(doc.Root != null)
    {
        doc.Root.Add(new XElement("Whatever"));
    }
}

private static MemoryStream GetXml()
{
    var settings = new XmlWriterSettings {Indent = true};

    var memoryStream = new MemoryStream();
    using (XmlWriter writer = XmlWriter.Create(memoryStream, settings))
    {
        writer.WriteStartDocument();
        writer.WriteStartElement("root");
        writer.WriteStartElement("element");
        writer.WriteString("content");
        writer.WriteEndElement();
        writer.WriteEndElement();
        writer.WriteEndDocument();
        writer.Flush();
    }

    return memoryStream;
}

Для эффективности попробуйте работать напрямую с XDocument.Кажется, вы хотите использовать XmlWriter, поэтому вот как это сделать (не проверено):

public void AppendElement()
{
    XDocument doc = GetXml();
    if(doc.Root != null)
    {
        doc.Root.Add(new XElement("Whatever"));
    }
}

private static XDocument GetXml()
{
    var doc = new XDocument();

    using (XmlWriter writer = doc.CreateWriter())
    {
        writer.WriteStartDocument();
        writer.WriteStartElement("root");
        writer.WriteStartElement("element");
        writer.WriteString("content");
        writer.WriteEndElement();
        writer.WriteEndElement();
        writer.WriteEndDocument();
        writer.Flush();
    }

    return doc;
}

Обновление:

Вы можете написатьXML с

doc.Save(HttpContext.Response.Output);

Опять же, я не могу проверить это сейчас, но попробуйте это:

private static XDocument GetXml()
{
    return new XDocument(
        new XElement(
            "root", 
            new XElement(
                "element", 
                "content")));
}
0 голосов
/ 20 марта 2010

Рассмотрим что-то вроде этого

XElement element = XElement.Parse(@" <root> 
                                      <element>content</element> 
                                    </root>");

element.Element("element").AddAfterSelf(new XElement("foo", "blah"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...