如何从流中将新元素附加到Xml

时间:2010-03-20 02:37:16

标签: c# .net xml

我有一个方法可以在内存流中返回一些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>

如何在根下插入新元素,例如:

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

编辑:

另外请建议最有效的方法,因为返回MemoryStream可能不是最佳解决方案。

最终的xml将传递给自定义HttpHandler,那么编写输出的最佳选择是什么?

context.Response.Write vs context.Response.OutputStream

2 个答案:

答案 0 :(得分:3)

您的第一个问题是您没有XML - 您有一个可以加载到XDocumentXmlDocument的字节流。您真的需要输出到流而不是直接输出到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")));
}

答案 1 :(得分:0)

考虑这样的事情

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

element.Element("element").AddAfterSelf(new XElement("foo", "blah"));