根据替换规则修改XDocument

时间:2014-09-18 20:46:55

标签: c# xml

我有一个看起来像这样的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>元素 <AddFeature> mode="Add" <Feature>获取<ProductName>元素的内容,并根据product属性将其添加到<AddFeature>标记

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

有任何想法或建议吗?是否有办法根据路径在XDocument中查找XElement?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

供参考:

答案 1 :(得分:0)

你没有提到这种转变发生的环境:XML的内联处理? ETL? ??

您可以开发XML转换模板(XMLT)(以<AddFearture mode=OPTION>为条件),以便就地添加新元素/属性。此模板可以内联应用。关于如何在网络上执行此操作有很多示例 - Google是您的朋友!

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

HTH!