2013-07-11 19 views
11

以下のxmlの例に示すように、powershellとXPathを使用してname属性を選択しようとしています。xpathの属性をpowershellでxpathを使用して選択する

 $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には "people"という名前のXMLノードはありません。代わりに "person"であるはずですか? –

+1

「動作していないようです」と指定してください。実際に何が起こったのですか?私はあなたが何が起こると予想しているか知っていると思いますが、それを指定することも害はありません。 – LarsH

答えて

14

私は$ハブが何であるかわからないんだけど、あなたはあなたが適切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 
} 
30

この2行で十分です:1行程度

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

Powershellのxmlオブジェクトとしてディレクトリ内のすべてのxmlファイルをどのようにキャストできますか? $ path = get-childitem -filter * .xml($ pathのforeach $ファイル){...#ここにある} – Sum1sAdmin

+0

新しい質問がある場合:新しい質問を投稿してください。コメント内の他の人の質問にフォローアップしないでください。 –

+0

申し訳ありませんが、新しい質問として投稿しました。http://stackoverflow.com/questions/42561059/powershell-how-to-cast-all-xml-files-as-xml-objects – Sum1sAdmin

19

どのように?選択-XMLのガベージ名前空間の取り扱いを回避するために持っている人のため

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

+1

Select-XMLがネームスペースを慎重に扱っているわけではありませんでした。パス内のすべての要素に対して名前空間パラメータ(ほとんどの場合のようにデフォルトのxmlnsを使用する場合はダミーの名前空間名を使用)を追加する必要があります。また、あらかじめネームスペースの値がわからない場合は、もはや1ライナー(または少なくとも1つの可読なもの)ではありません。 –

3

、ここでは気にしませんワンライナーは、限り、あなたはダイレクトパスを知っているように、です:

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

上記の場合、一致するすべてのノードも返されます。それは強力ではありませんが、スキーマを知っていて、素早く1つのことを望むときはきれいです。

関連する問題