2013-07-11 12 views
11

Próbuję użyć powershell i XPath, aby wybrać atrybut nazwy pokazany w poniższym przykładzie xml.Wybieranie atrybutów w xml przy użyciu xpath w powłoce powers

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

Powyżej znajduje się kod działający w celu wypróbowania nazwy, ale nie działa. Jakieś sugestie?

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

Z góry dziękuję!

+2

Czy to literówka? Twój xpath ma "ludzi", ponieważ nie masz żadnych węzłów XML o tej nazwie ... Czy ma to być "osoba"? –

+1

Proszę podać "nie wydaje się działać." Co się właściwie wydarzyło? Myślę, że wiem, czego się spodziewałeś, ale nie zaszkodzi również to określić. – LarsH

Odpowiedz

14

Nie jestem pewien, co $ piasta jest, i rozpoczął swój kod od środka, więc nie jest jasne, czy prawidłowo ustawione $ file do obiektu XmlDocument, ale myślę, że to, co chcesz:

[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

Te dwie linie powinny wystarczyć:

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

Jak możemy rzutować wszystkie pliki xml w katalogu jako obiekty XML w Powershell? jak w $ path = get-childitem -filter * .xml (foreach $ file in $ path) {... # co tu idzie} – Sum1sAdmin

+0

Jeśli masz nowe pytanie: opublikuj nowe pytanie. Nie odpowiadaj na czyjeś pytanie w komentarzach. –

+0

Przepraszam, zamieściłem jako nowe pytanie http://stackoverflow.com/questions/42561059/powershell-how-to-cast-all-xml-files-as-xml-objects – Sum1sAdmin

19

Jak o jeden wiersz?

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

+1

To byłoby idealne, gdyby było nie było dla okrutnej obsługi przestrzeni nazw Select-XML. Musisz dodać parametr przestrzeni nazw (z fikcyjną nazwą przestrzeni nazw, jeśli używa on domyślnych xmlns jak większość) dla każdego elementu w ścieżce. I nie jest to już jedno-liniowy (lub przynajmniej czytelny), jeśli nie znasz wartości przestrzeni nazw przed czasem. –

3

Dla każdego, kto ma do obejścia Select-XML śmieci obsługę przestrzeni nazw użytkownika, oto jeden-liner, że nie obchodzi, tak długo jak wiesz bezpośrednią ścieżkę:

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

Powyższe zwróci również wszystkie pasujące węzły. Nie jest tak potężny, ale jest czysty, kiedy znasz schemat i chcesz szybko go wyciągnąć.