xml - powershell xml 排序节点和 replacechild

标签 xml powershell powershell-3.0

我正在尝试使用 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/

相关文章:

java - SAX 字符缓冲区大小

windows - 如何使用 Powershell 在 Docker RUN 命令中扩展参数?

events - 是否可以将事件附加到 PSObject?

arrays - 在 Powershell 中内联创建和拆分数组两次

maven - 函数参数名称中的点

android - 当我在布局末尾对齐选项卡布局时,布局顶部留下了一个空格

xml - 有没有办法在 Jenkins 中为 JUnit 测试结果定义 "number of builds"?

java - 仅当方法使用 xml/json 时才需要 JAXB 元素

powershell - PowerShell Set-ItemProperty与点设置属性

.net - 从Powershell表单文本框中删除字符限制