我有一个看起来像这样的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?
答案 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!