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

powershell xml排序节点和替换子节点

发布时间:2020-12-16 23:18:23 所属栏目:百科 来源:网络整理
导读:我试着用power shell和xml做一些非常简单的事情,但没有一点麻烦. 基本上我正在尝试使用以下xml …并按名称对机器元素进行排序.然后将它们放回 XML中,以便我可以保存回文件. 如果输出$new对象,排序似乎有效,但是在替换它期间它抱怨“无法转换参数”0“,值为:
我试着用power shell和xml做一些非常简单的事情,但没有一点麻烦.
基本上我正在尝试使用以下xml …并按名称对机器元素进行排序.然后将它们放回 XML中,以便我可以保存回文件.

如果输出$new对象,排序似乎有效,但是在替换它期间它抱怨“无法转换参数”0“,值为:”System.Object []“for”ReplaceChild“键入”System.Xml.XmlNode“: “无法将”System.Object []“转换为”System.Xml.XmlNode“类型.

如果我在$orig和$new上都有一个Get-Member,他们都说它们是XMLElement类型,我认为它继承自XMLNode.

我想念的是什么人?使我抓狂.谢谢你的帮助!

<company>
    <stuff>
    </stuff>
    <machines>
        <machine>
            <name>ca</name>
            <b>123</b>
            <c>123</c>
        </machine>
        <machine>
            <name>ad</name>
            <b>234</b>
            <c>234</c>
        </machine>
        <machine>
            <name>be</name>
            <b>345</b>
            <c>345</c>
        </machine>
    </machines>
    <otherstuff>
    </otherstuff>
</company>

[xml]$xml = (get-content Company.xml)
[XmlNode]$orig = $xml.Company.Machines
[XmlNode]$new = ($orig.Machine | sort Name )
$xml.Company.ReplaceChild($new,$orig)

解决方法

这里有各种各样的问题.一个是你的sort返回一个xml元素列表而不是一个xml元素.另一个问题是它返回原始的xml元素而不是副本,因此使用它们对xml DOM的任何操作也会影响结果.

这是获得您想要的简单方法.按相反顺序排序,然后依次将每个节点插入其他节点前面.每次从排序结果中插入节点时,它都会自动将其从原始节点集中删除:

[xml]$xml = @"
<company>
    <stuff>
    </stuff>
    <machines>
        <machine>
            <name>ca</name>
            <b>123</b>
            <c>123</c>
        </machine>
        <machine>
            <name>ad</name>
            <b>234</b>
            <c>234</c>
        </machine>
        <machine>
            <name>be</name>
            <b>345</b>
            <c>345</c>
        </machine>
    </machines>
    <otherstuff>
    </otherstuff>
</company>
"@
[System.Xml.XmlNode]$orig = $xml.Company.Machines
$orig.Machine | sort Name  -Descending |
  foreach { [void]$xml.company.machines.PrependChild($_) }
$xml.company.machines.machine

编辑:管道也可以按升序编写(如David Martin指出的那样),并且您可以通过使用变量中的节点来减少键入:

$orig.Machine | sort Name | % { [void]$orig.AppendChild($_) }

(编辑:李大同)

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

    推荐文章
      热点阅读