我试着用power
shell和xml做一些非常简单的事情,但没有一点麻烦.
基本上我正在尝试使用以下xml …并按名称对机器元素进行排序.然后将它们放回 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($_) }