根据替换规则修改XDocument

本文关键字:修改 XDocument 规则 替换 | 更新日期: 2023-09-27 18:22:20

我有一个XML文档,看起来像这个

<root>
  <Product>
    <ProductName attr1="asdf">
      <Feature1 attr1="asdf">
        <Feature2 />
      </Feature1>
      <Feature3 attr1="asdf" attr2="qwer" />
    </ProductName>
  </Product>
</root>

我需要基于XML形式的命令来更新它,比如那些

<XmlCommands>
  <AddProduct>
    <Product>
      ...
    </Product>
  </AddProduct>
  <AddFeature>
    <Feature product="ProductName" mode="Add">
      <Feature4 attr1="zxcv"/>
    </Feature>
    <Feature product="ProductName" path="???" mode="Replace">
      ???
    </Feature>
  </AddFeature>
</XmlCommands>

所以基本上,有不同类型的命令

<AddProduct>获取<AddProduct>元素的内容并将其添加到<root>元素具有mode="Add"<AddFeature>获取<Feature>元素的内容,并根据product属性将其添加到<ProductName>标签

使用<AddFeature>mode="Replace"会变得棘手。我需要找到一种方法来获取<Feature>元素的内容,并使用它来替换元素或属性的内容,可能基于<Feature>元素中的path属性

有什么想法或建议吗?是否有一种方法可以基于路径在XDocument中查找XElement?

根据替换规则修改XDocument

XPath怎么样?它是一种富含过滤能力的路径表达式,因此我们可以不仅根据元素的路径,还根据元素的值、元素的属性值等来匹配XML文档的任何特定部分

例如,您可以传递以下XPath来替换属性attr1等于"asdf":的现有<ProductName>

<Feature product="ProductName" mode="Replace"
         path="//Product/ProductName[@attr1='asdf']">
  .....
</Feature>

我们可以使用XPathSelectElement()扩展方法,使用XPath表达式作为参数,从XDocument中获得特定的XElement。只需将path属性值传递给此方法,它就可以找到正确的元素。

供参考:

  • MSDN:XPath示例

  • w3schools XPath教程

  • W3C:XML路径语言(XPath)版本1.0

您没有提到发生此转换的环境:XML的内联处理?ETL??

您可以开发一个XML转换模板(XMLT)(以<AddFearture mode=OPTION>为条件),将新的Elements/Attribute添加到相应的Feature中。这个模板可以内联应用。网上有很多关于如何做到这一点的例子——谷歌是你的朋友!

您还可以编写一个应用程序,使用.Net的Linq或System.XML等框架库来打开和操作XML树。可以说更容易,但需要外部处理。

啊!