gpt4 book ai didi

xml - powershell xml 排序节点和 replacechild

转载 作者:数据小太阳 更新时间:2023-10-29 02:02:08 27 4
gpt4 key购买 nike

我正在尝试使用 powershell 和 xml 做一些非常简单的事情,但没有遇到任何麻烦。基本上我正在尝试采用以下 xml... 并按名称对机器元素进行排序。然后将它们放回 XML 中,以便我可以保存回文件中。

如果输出 $new 对象,排序似乎有效,但是,在 replacechild 期间它提示“无法转换参数“0”,值为:“System.Object[]”对于“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($_) }

关于xml - powershell xml 排序节点和 replacechild,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21104514/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com