web-dev-qa-db-fra.com

Sélection d'attributs en XML à l'aide de xpath dans PowerShell

J'essaie d'utiliser powershell et XPath pour sélectionner l'attribut name indiqué dans l'exemple xml ci-dessous.

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

Ci-dessus, le code im en cours d'exécution pour essayer d'obtenir le nom, mais il ne semble pas fonctionner. Aucune suggestion?

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

Merci d'avance!

15
user1044585

Je ne sais pas exactement ce qu'est $ hub, et vous avez commencé votre code à partir du milieu, il n'est donc pas clair si vous définissez correctement $ file sur un objet XmlDocument, mais je pense Voici ce que vous voulez:

[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
}
15
Adi Inbar

Ces deux lignes devraient suffire:

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

Que diriez-vous d'une ligne?

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

20
CommonToast

Pour tous ceux qui doivent contourner la gestion de l'espace de noms de Select-Xml, voici un one-liner qui ne se soucie pas, tant que vous connaissez le chemin direct:

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

Ce qui précède renverra également tous les nœuds correspondants. Ce n'est pas aussi puissant, mais c'est propre lorsque vous connaissez le schéma et que vous voulez en retirer rapidement une chose.

4
John Neuhaus