首页 > 解决方案 > 如何从具有节点的函数返回 XML 文件?

问题描述

我有一个简单的 XML

<bds>
<bd>
    <id>10</id>
    <user>john</user>
    <servers>
        <name>pc24</name> 
    </servers>
</bd>
<bd>
    <id>12</id>
    <user>peter</user>
    <servers>
        <name>pc25</name> 
    </servers>
</bd>

我有一个函数,我希望它返回一个 XML 文件,其中包含挂在节点上的所有元素。

$collection = "bds"
$attribute = "name"
$obj = "pc25"


function test () {

    if ($xml.SelectNodes("//$attribute").name -eq "name") {
    

        return $xml.SelectNodes("//$attribute").parentnode | Where $attribute -eq $obj
    
    }

    else {
    
        return $false

    }
}

我希望函数的输出是:

        <id>12</id>
        <user>peter</user>
        <servers>
            <name>pc25</name> 
        </servers>

如何生成带有函数返回的 XML 文件?

标签: powershellpowershell-2.0powershell-3.0powershell-4.0

解决方案


您可以使用稍微更智能的 XPath 来选择节点,然后使用InnerXml属性来获取您所追求的输出字符串:

PS> $xml = [xml] @"
<bds>
  <bd>
    <id>10</id>
    <user>john</user>
    <servers>
      <name>pc24</name>
    </servers>
  </bd>
  <bd>
    <id>12</id>
    <user>peter</user>
    <servers>
      <name>pc25</name>
    </servers>
  </bd>
</bds>
"@

PS> $xml.SelectNodes("bds/bd[servers/name = 'pc25']").InnerXml
<id>12</id><user>peter</user><servers><name>pc25</name></servers>

注意 -bds/bd[servers/name = 'pc25']意思是“找到所有bds/bd具有值的子servers/name节点的节点pc25”。

然后,您可以根据需要使用 XPath 字符串中的变量值将其重新安装到您的函数中......


推荐阅读