加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

修改使用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()}

如果这两个都可以在一个令人敬畏的命令中完成

也许我也试图在一行中做很多事情

任何指针都非常感谢!
不确定我在这里做错了什么因为powershell不会为父节点使用而抛出错误但只是不打印任何东西.所有经验丰富的程序员都可以为您提供帮助!

您可以通过 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) }
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读