2013-07-11 11 views
11

Sto tentando di utilizzare PowerShell e XPath per selezionare l'attributo nome mostrato nell'esempio sotto xml.Selezione degli attributi in xml utilizzando xpath nella PowerShell

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

Sopra è il codice im in esecuzione per provare e ottenere il nome, ma non sembra funzionare. Eventuali suggerimenti?

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

Grazie in anticipo!

+2

È un refuso? Il tuo xpath ha "persone" da te non hanno nodi XML con quel nome ... Si suppone che sia "persona" invece? –

+1

Si prega di specificare "non sembra funzionare." Cosa è successo realmente? Penso di sapere cosa ti aspettavi che accadesse, ma non sarebbe male specificarlo anche tu. – LarsH

risposta

14

io non sono sicuro di quello che $ hub è, e hai iniziato il tuo codice a partire dalla metà quindi non è chiaro se si imposta correttamente $ file a un oggetto XmlDocument, ma penso che questo è ciò che si vuole:

[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

Queste due linee dovrebbe essere sufficiente:

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

come possiamo eseguire il cast di tutti i file xml in una directory come oggetti xml in PowerShell? come in $ percorso = get-childitem -filter * .xml (foreach $ file in $ percorso) {... # cosa va qui} – Sum1sAdmin

+0

Se hai una nuova domanda: per favore pubblica una nuova domanda. Non dare seguito alla domanda di qualcun altro nei commenti. –

+0

scusate, ho postato una nuova domanda http://stackoverflow.com/questions/42561059/powershell-how-to-cast-all-xml-files-as-xml-objects – Sum1sAdmin

19

Che ne dite di una riga?

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

+1

Sarebbe perfetto se fosse non era per la manipolazione atroce dei namespace di Select-XML. Dovresti aggiungere un parametro namespace (con un nome di spazio dei nomi fittizio se usa il xmlns predefinito come la maggior parte) per ogni elemento nel percorso. E non è più un one-liner (o almeno uno leggibile) se non si conosce il valore dello spazio dei nomi prima del tempo. –

3

Per chiunque che deve risolvere Select-Xml gestione dello spazio dei nomi di immondizia di, ecco una battuta che non si cura, fino a quando si conosce il percorso diretto:

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

Quanto sopra restituirà tutti i nodi corrispondenti. Non è così potente, ma è pulito quando si conosce lo schema e si desidera una cosa in fretta.