gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 02:09:40 24 4
gpt4 key购买 nike

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

最佳答案

您的第一个问题是您没有 XML - 您有一个可以加载到 XDocumentXmlDocument 中的字节流。您真的需要输出到流而不是直接输出到 XML 文档吗?

顺便说一句,我认为您需要去掉 MemoryStream 周围的 using block 。处理流后,您将无法再使用该流。

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")));
}

关于c# - 如何从流中将新元素附加到 Xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2481691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com