如何将包含 XML 的 Stream 的内容作为子项添加到现有的 XmlElement 中?
How to add the contents of a Stream containing XML into an existing XmlElement as a child?
我有一个包含 XML 的 Stream
,我想加载其内容,然后将其根元素作为子元素添加到现有的 XmlElement
。我知道已经有 XmlDocument.Load(Stream stream);
,但这将创建一个完整的独立 XML 文档。相反,我想在给定现有 XmlDocument
的情况下,指定该文档中的一个元素来加载流。这可能吗?
要将流中的 XML 添加为现有 XmlElement
的子级,您可以先将 XML 加载到 XmlDocumentFragment
中,然后附加片段,如下:
// stream is an opened Stream containing a valid XML document
// xmlElement is an xmlElement
using (var reader = XmlReader.Create(stream))
{
var fragment = xmlElement.OwnerDocument.CreateDocumentFragment();
using (var writer = fragment.CreateNavigator().AppendChild())
{
writer.WriteNode(reader, true);
}
foreach (var child in fragment.ChildNodes.OfType<XmlElement>().ToList())
xmlElement.AppendChild(child);
}
此解决方案具有内存效率,因为它避免将整个 XML 加载到临时字符串中进行解析,而是将 XML reader 和使用 [=15= 的编写器链接在一起].
示例 fiddle。
我有一个包含 XML 的 Stream
,我想加载其内容,然后将其根元素作为子元素添加到现有的 XmlElement
。我知道已经有 XmlDocument.Load(Stream stream);
,但这将创建一个完整的独立 XML 文档。相反,我想在给定现有 XmlDocument
的情况下,指定该文档中的一个元素来加载流。这可能吗?
要将流中的 XML 添加为现有 XmlElement
的子级,您可以先将 XML 加载到 XmlDocumentFragment
中,然后附加片段,如下:
// stream is an opened Stream containing a valid XML document
// xmlElement is an xmlElement
using (var reader = XmlReader.Create(stream))
{
var fragment = xmlElement.OwnerDocument.CreateDocumentFragment();
using (var writer = fragment.CreateNavigator().AppendChild())
{
writer.WriteNode(reader, true);
}
foreach (var child in fragment.ChildNodes.OfType<XmlElement>().ToList())
xmlElement.AppendChild(child);
}
此解决方案具有内存效率,因为它避免将整个 XML 加载到临时字符串中进行解析,而是将 XML reader 和使用 [=15= 的编写器链接在一起].
示例 fiddle。