【问题标题】:How to replace elements in one XDocument with elements from another XDocument?如何用另一个 XDocument 中的元素替换一个 XDocument 中的元素?
【发布时间】:2012-10-18 13:59:14
【问题描述】:

我有一个包含许多数据项的 XDocument。

我有另一个 XDocument,其中包含非常小的数据项集合。较小文档中的数据项在匹配路径处具有较大文档中的对应元素。

我想要做的是循环遍历较小的文档,并且对于我发现的每个元素,我都想更新较大的文档,以便将其对应的值替换为较小的文档的值。

例如较大的文档:

<Rootelement>
  <Desktop>
    <A>
      <El1 label="original blah" />
    </A>
  </Desktop>
  <Desktop>
    <B>
      <El2 />
    </B>
  </Desktop>
  <Desktop>
    <C>
      <El3 label="I'm the label" tooltip="I'm the tooltip" />
    </C>
  </Desktop>
</Rootelement>

较小的文档:

<Rootelement>
  <Desktop>
    <C>
      <El3 label="The NEW Label" tooltip="The NEW Tooltip" />
    </C>
  </Desktop>
</Rootelement>

我想取路径Rootelement/Desktop/C/El3处的元素,并将大文档中相同路径的元素替换为小文档中的元素,所以大文档变为:

<Rootelement>
  <Desktop>
    <A>
      <El1 label="original blah" />
    </A>
  </Desktop>
  <Desktop>
    <B>
      <El2 />
    </B>
  </Desktop>
  <Desktop>
    <C>
      <El3 label="The NEW Label" tooltip="The NEW Tooltip" />
    </C>
  </Desktop>
</Rootelement>

对我来说最好的方法是什么?

【问题讨论】:

    标签: c# xml linq-to-xml


    【解决方案1】:
    var xDocBig = XDocument.Parse(xmlBig);
    var xDocSmall = XDocument.Parse(xmlSmall);
    
    var eBig = xDocBig.XPathSelectElement("/Rootelement/Desktop/C");
    var eSmall = xDocSmall.XPathSelectElement("/Rootelement/Desktop/C");
    
    eBig.ReplaceWith(eSmall);
    
    var newXml = xDocBig.ToString();
    

    【讨论】:

    • 这看起来不错,但XPathSelectElement 似乎在XDocument 上不可用。我正在阅读我需要包含 System.Linq,但我已经在引用它,但它仍然未被识别。仅适用于3.5吗?我正在使用 4.0。
    • System.Xml.XPath命名空间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2011-10-19
    • 2012-01-17
    • 2020-03-29
    相关资源
    最近更新 更多