【问题标题】:How to add the contents of a Stream containing XML into an existing XmlElement as a child?如何将包含 XML 的 Stream 的内容作为孩子添加到现有的 XmlElement 中?
【发布时间】:2016-11-09 18:40:35
【问题描述】:

我有一个包含 XML 的 Stream,我想加载它的内容,然后将其根元素作为子元素添加到现有的 XmlElement。我知道已经有XmlDocument.Load(Stream stream);,但这将创建一个完整的、独立的 XML 文档。相反,我想,给定一个现有的XmlDocument,在该文档中指定一个元素来加载下面的流。这可能吗?

【问题讨论】:

  • 您有一个流并将其保存为 XML。给定的代码正好相反:它将 XML 保存到流中。你想要什么?
  • 是的,您可以选择 xml 的一个节点并将流保存到该节点...类似的东西?
  • @Hackerman 这正是我要找的东西
  • 您可以使用SelectNodes 方法或SelectSingleNode 方法和xpath 查询来做到这一点,并用您的值替换节点的innerText 或innerXml。
  • @dbc 也许我误解了XmlDocument.Save 的工作原理。我想稍后将 xml 元素“转换”为流,但目前我关心的是相反的情况:将流写入特定的 xml 元素

标签: c# xml stream xmldocument


【解决方案1】:

要将来自流的 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 加载到临时字符串中进行解析,而是使用 XmlWriter.WriteNode(XmlReader, Boolean) 将 XML 读取器和写入器链接在一起。

示例fiddle

【讨论】:

    猜你喜欢
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多