我有一个方法可以在内存流中返回一些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
答案 0 :(得分:3)
您的第一个问题是您没有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;
}
更新:
您可以使用
编写XMLdoc.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"));