修改使用powershell迭代子属性的XML父属性
发布时间:2020-12-16 07:57:13 所属栏目:百科 来源:网络整理
导读:所以我有以下xml(items.xml),我想找到子节点项的属性迭代通过属性,如果我在父节点级别找到类似的属性,用子节点属性替换相同的属性,并删除子属性除了名字. items model type="model1" name="default" price="12.12" date="some_value" PriceData item name="w
所以我有以下xml(items.xml),我想找到子节点项的属性迭代通过属性,如果我在父节点级别找到类似的属性,用子节点属性替换相同的属性,并删除子属性除了名字.
<items> <model type="model1" name="default" price="12.12" date="some_value"> <PriceData> <item name="watch" price="24.28" date="2013-12-01" /> </PriceData> </model> <model type="model2" name="default" price="12.12" date="some_value"> <PriceData> <item name="toy" price="22.34" date="2013-12-02"/> </PriceData> </model> <model type="model3" name="default" price="12.12" date="some_value"> <PriceData> <item name="bread" price="24.12" date="2013-12-03"/> </PriceData> </model> </items> 最终的xml应该是这样的 <items> <model type="model1" name="watch" price="24.28" date="2013-12-0"> <PriceData> <item name="watch" /> </PriceData> </model> <model type="model2" name="toy" price="22.34" date="2013-12-02"> <PriceData> <item name="toy" "/> </PriceData> </model> <model type="model3" name="bread" price="24.12" date="2013-12-03"> <PriceData> <item name="bread" /> </PriceData> </model> </items> 我能够在子级别获取属性,但是我无法从子级别遍历回父节点. 以下是我试图访问父节点的代码 [xml]$model = get-content items.xml $model.SelectNodes("//item/@*") Output: #text ----- watch 24.28 2013-12-01 toy 22.34 2013-12-02 bread 24.12 2013-12-03 $model.SelectNodes("//item/@*") | foreach {write-host $_.parentnode} No Output: $model.SelectNodes("//item/@*") | foreach {write-host $_.parentnode.parentnode} No Output: 我可以得到子节点的属性名称,如下所示: $model.SelectNodes("//item/@*") | foreach {write-host $_.name} Output: PS C:BIOS_Work_DirKit_Manifest_test> $model.SelectNodes("//item/@*") | foreach {write-host $_.name} name price date name price date name price date 现在对于每个属性,我只需要返回父节点,检查是否存在类似属性并将其替换为子节点属性 所以,我正在寻找类似的东西 $model.SelectNodes("//item/@*") | foreach {($_.name).parentnode.parentnode.($_.name)} | <some code to replace parentnode attribute with child attribute> 然后删除子属性之类的东西 $model.SelectNodes("//item/@*") | where {$_.name -notlike "name"} | foreach {$_.Removeattribute()} 如果这两个都可以在一个令人敬畏的命令中完成 也许我也试图在一行中做很多事情 任何指针都非常感谢!
您可以通过
OwnerElement 属性从属性中获取父元素.所以这是获得所需输出的一种可能方式:
$model.SelectNodes("//item/@*") | ForEach { # set attributes value on `model` element $_.OwnerElement.ParentNode.ParentNode.SetAttribute($_.LocalName,$_.Value) # remove attributes except `name` from `item` element If ($_.LocalName -ne "name") { $_.OwnerElement.RemoveAttribute($_.LocalName) } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- ajax异步请求,session超时处理
- reactjs – 我应该在学习Clojurescript Om之前学
- ruby-on-rails – Rails日志模型错误失败保存
- 完全用代码实现ListView,不涉及任何xml的layout
- react-router – 如何在反应路由器v4中传递道具?
- ruby-on-rails – Gitlab不会发送电子邮件 – om
- Flex在线阅读 FlexBook FlexPaper .
- 详解Vue的钩子函数(路由导航守卫、keep-alive、生
- Dojo判断tree下是否含有子节点
- nosql – Leveldb与Redis或Riak或Tokyo Tyrant相
热点阅读