Déterminer Nœud XML Existe
C'est sans doute simple, mais je vais essayer de déterminer si un nœud existe dans un document XML. J'ai pensé que j'ai trouvé la réponse dans ce post,
Comment vérifier si un nœud existe ou non à l'aide de powershell sans se faire exception?, mais je n'ai pas à le faire fonctionner. C'est ma dernière tentative.
foreach ($vendor in $xml.Vendors.Vendor| Where-Object {$_.Type -match "Send"}) {
$NodeExists = $vendor.SelectSingleNode($vendor.EncKey)
if ($NodeExists -ne $null) {
# Do something
}
else {
# something else
}
}
Toute aide serait grandement appréciée.
EDIT: Voici XML à partir de mon fichier de test. J'ai besoin de savoir de EncKey existe ou note pour chaque fournisseur.
<?xml version="1.0" encoding="UTF-8"?>
<!-- Vendors we will send and retreive files from Get-Send means we will get a file and send them a file Send means we will only send them a file-->
<Vendors>
<Vendor Type="Get-Send">
<Name>Vendor1</Name>
<RemotePath>/Remote/Path1/</RemotePath>
<EncKey>pgpenc.key</EncKey>
</Vendor>
<Vendor Type="Send">
<Name>Vendor2</Name>
<RemotePath>/Remote/Path2/</RemotePath>
<!-- This one has no EncKey -->
</Vendor>
</Vendors>
Pourriez-vous fournir une réduction de cas de test pour votre question? Quelque chose que nous pouvons coller dans notre favori Powershell de l'éditeur et de jouer avec elle?
OriginalL'auteur mack | 2013-12-06
Vous devez vous connecter pour publier un commentaire.
La meilleure façon que je peux penser est d'essayer d'écrire le nœud de valeur à une variable, et de voir ensuite si cette variable est null. Voici un exemple avec la librairie standard de fichier xml.
Alors, pour ton script, je pense que ça pourrait être
Vous pouvez raccourcir ce avec des "si ( $vendeur.EncKey ) {" -- aussi, c'est insensible à la casse, par rapport à SelectSingleNode qui n'a pas fonctionné pour moi. Je n'ai pas de problème d'exception avec cette.
vous recevrez une exception lorsque vous avez mode strict activé. Lorsque le mode strict est éteint, puis
$vendor.EncKey
évalue à$false
dans la déclarationif ( $vendor.EncKey )
, comme prévu par @JayOriginalL'auteur Alex McKenzie
Utiliser XPath pour sélectionner les nœuds correspondants. InnerText est consultable par
text()
. Vous pouvez utiliserwhere-object
, ou?
trop; le comportement est un peu différent. Sans XML exemple, il est difficile d'être plus précis. L'utilisation de XPath comme,OriginalL'auteur vonPryz
À condition de charger le $objet xml comme un XmlDocument à l'aide de
Alors vous pouvez le faire, ce qui est beaucoup plus simple:
OriginalL'auteur Alex Fairchild
Il semble que j'ai été en utilisant la mauvaise syntaxe pour SelectSingleNode. Voici un exemple de travail.
Merci à tous pour votre aide.
Bon, mais doit être à l'opposé. if ($NodeExists -ne $null) { write-host "EncKey n'est PAS null" }
OriginalL'auteur mack