微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我试着用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($_) }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。