在powershell中使用xpath选择xml中的属性

use*_*585 15 xml powershell scripting xpath

我试图使用powershell和XPath来选择下面的xml示例中显示的name属性.

     $xml_peoples= $file.SelectNodes("//people") 
     foreach ($person in $xml_peoples){
            echo $person.attributes
            #echo $person.attributes.name
     }
Run Code Online (Sandbox Code Playgroud)

上面是运行试图获取名称的代码,但它似乎不起作用.有什么建议?

<peoples>
    <person name='James'>
        <device>
            <id>james1</id>
            <ip>192.192.192.192</ip>
        </device>
    </person>
</peoples>
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Ans*_*ers 34

这两行应该足够了:

[xml]$xml = Get-Content 'C:\path\to\your.xml'
$xml.selectNodes('//person') | select Name
Run Code Online (Sandbox Code Playgroud)


Com*_*ast 21

一行怎么样?

Select-XML -path "pathtoxml" -xpath "//person/@name"

  • 如果不是Select-XML对命名空间的恶劣处理,那将是完美的.对于路径中的每个元素,您需要添加一个名称空间参数(如果它使用默认的xmlns,则使用虚拟名称空间名称).如果您事先不知道名称空间值,它就不再是单行(或至少是可读的). (3认同)

Adi*_*bar 15

我不确定$ hub是什么,你从中间开始编写代码,所以不清楚你是否正确地将$ file设置 XmlDocument对象,但我认为这就是你想要的:

[System.Xml.XmlDocument]$file = new-object System.Xml.XmlDocument
$file.load(<path to XML file>)
$xml_peoples= $file.SelectNodes("/peoples/person")
foreach ($person in $xml_peoples) {
  echo $person.name
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*aus 7

对于必须解决 Select-Xml 的垃圾名称空间处理的任何人,只要您知道直接路径,这里有一个不关心的单行:

([xml](Get-Content -Path "path\to.xml")).Peoples.Person.Name
Run Code Online (Sandbox Code Playgroud)

以上也将返回所有匹配的节点。它没有那么强大,但是当您了解架构并希望快速从中获得一件事时,它是干净的。