2013-07-11 78 views
11

我試圖使用PowerShell和XPath選擇在下面的XML例子所示的name屬性的XML屬性。選擇在使用XPath在PowerShell中

 $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> 

在此先感謝!

+2

這是一個錯字嗎?你的xpath有「人」,你沒有這個名字的XML節點......它應該是「人」而不是? –

+1

請指定「似乎不起作用」。究竟發生了什麼?我想我知道你預計會發生什麼,但是指定這一點也不會有什麼壞處。 – LarsH

回答

14

我不知道什麼$樞紐是,你從中間開始你的代碼,因此目前還不清楚,如果你正確設置$文件到如下的對象,但我認爲這是你想要什麼:

[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 
} 
30

這兩條線應該足夠了:

[xml]$xml = Get-Content 'C:\path\to\your.xml' 
$xml.selectNodes('//person') | select Name 
+0

我們如何將所有xml文件作爲Powershell中的xml對象轉換爲目錄?如$ path = get-childitem -filter * .xml(foreach $ path中的$ file){...#what goes here} – Sum1sAdmin

+0

如果您有新問題:請發佈新問題。不要在評論中追蹤別人的問題。 –

+0

對不起,我已經張貼了一個新問題http://stackoverflow.com/questions/42561059/powershell-how-to-cast-all-xml-files-as-xml-objects – Sum1sAdmin

19

如何一行?

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

+1

這將是完美的,如果它並不是因爲Select-XML對命名空間的殘酷處理。您需要爲路徑中的每個元素添加一個名稱空間參數(如果它使用默認的xmlns,則使用默認的名稱空間名稱)。如果您事先不知道名稱空間的值,它就不再是單行(或至少是可讀的)。 –

3

對於任何人有解決選擇的XML的垃圾名稱空間處理,這裏是一個一行,不關心,只要你知道直接路徑:

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

以上將返回所有匹配的節點。它沒有那麼強大,但是當你知道該模式並且很快就想要一件事情時它就乾淨了。