20

我正在尝试使用 powershell 和 XPath 来选择下面 xml 示例中显示的名称属性。

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

上面是我正在运行以尝试获取名称的代码,但它似乎不起作用。有什么建议么?

<peoples>
    <person name='James'>
        <device>
            <id>james1</id>
            <ip>192.192.192.192</ip>
        </device>
    </person>
</peoples>

提前致谢!

4

4 回答 4

36

这两行就足够了:

[xml]$xml = Get-Content 'C:\path\to\your.xml'
$xml.selectNodes('//person') | select Name
于 2013-07-11T09:03:07.293 回答
25

一根线怎么样?

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

于 2014-08-12T07:40:54.540 回答
16

我不确定$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
}
于 2013-07-11T01:58:04.157 回答
7

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

([xml](Get-Content -Path "path\to.xml")).Peoples.Person.Name

以上也将返回所有匹配的节点。它没有那么强大,但是当您知道架构并想要快速从中得到一件事时,它就很干净了。

于 2017-08-22T16:43:26.297 回答