2013-07-11 9 views
11

Ich versuche, Powershell und XPath zu verwenden, um das Namensattribut auszuwählen, das im folgenden xml-Beispiel gezeigt wird.Auswählen von Attributen in xml mit xpath in Powershell

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

Oben ist der Code im Laufe um den Namen zu versuchen und zu erhalten, aber es scheint nicht zu funktionieren. Irgendwelche Vorschläge?

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

Vielen Dank im Voraus!

+2

Ist es ein Tippfehler? Ihr xpath hat "Leute" von Ihnen, die keine XML-Knoten mit diesem Namen haben ... Soll es stattdessen "Person" sein? –

+1

Bitte spezifizieren Sie "scheint nicht zu funktionieren." Was wirklich passierte? Ich denke, ich weiß, was Sie erwartet haben, aber es würde nicht schaden, das auch zu spezifizieren. – LarsH

Antwort

14

Ich bin mir nicht sicher, was $ Nabe ist, und Sie haben Code aus der Mitte, so dass es nicht klar ist, wenn Sie richtig $ file auf ein XmlDocument-Objekt festgelegt, aber ich denke, das ist, was Sie wollen:

[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

sollten diese beiden Linien genügen:

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

Wie können wir alle XML-Dateien in einem Verzeichnis als XML-Objekte in Powershell umwandeln? wie in $ path = get-childitem -filter * .xml (foreach $ datei in $ path) {... # what goes here} – Sum1sAdmin

+0

Wenn Sie eine neue Frage haben: Bitte posten Sie eine neue Frage. Verfolgen Sie nicht die Frage einer anderen Person in Kommentaren. –

+0

Entschuldigung, ich habe als neue Frage http://stackoverflow.com/questions/42561059/powershell-how-to-cast-all-xml-files-as-xml-objects – Sum1sAdmin

19

Wie wäre es eine Zeile?

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

+1

Das wäre perfekt, wenn es war nicht für die grausame Handhabung von Namespaces durch Select-XML. Sie müssten einen Namespace-Parameter (mit einem Dummy-Namespace-Namen, wenn er die Standard-Xmlns wie die meisten verwendet) für jedes Element im Pfad hinzufügen. Und es ist nicht länger ein Einzeiler (oder zumindest ein lesbarer), wenn Sie den Namespace-Wert im Voraus nicht kennen. –

3

Für alle, die sich um Müll Namespace Handling des Select-XML arbeiten muss, ist hier ein Einzeiler, die nicht, solange Sie den direkten Weg wissen schert:

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

Das obige gibt auch alle übereinstimmenden Knoten zurück. Es ist nicht so mächtig, aber es ist sauber, wenn Sie das Schema kennen und schnell eine Sache daraus machen wollen.