Sha*_*unt 4 xml powershell powershell-3.0
我试着用powershell和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)
Run Code Online (Sandbox Code Playgroud)
这里有各种各样的问题.一个是你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
Run Code Online (Sandbox Code Playgroud)
编辑:管道也可以按升序排序(如David Martin指出的那样),并且您可以通过使用变量中的节点来减少键入:
$orig.Machine | sort Name | % { [void]$orig.AppendChild($_) }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7566 次 |
| 最近记录: |