J'ai un XML où les noms d'attributs peuvent être des combinaisons de lettres minuscules et majuscules. Dans l'exemple ci-dessous, l'attribut "DataSource" peut avoir un nombre quelconque de lettres minuscules et majuscules.
J'ai besoin de récupérer ces nœuds où "DataSource" est XML. J'ai cherché partout sur Internet, mais je n'ai trouvé aucune solution pour cela. Plusieurs exemples sont là pour Traduire (), minuscule () mais ils ne correspondent pas à mon scénario. P>
[xml] $GM_ProcessXML =@' <Process> <Parameter Name="Parameter1" Datasource="XML"><![CDATA[Sujeet]]></Parameter> <Parameter Name="Parameter2" DataSource="XML"><![CDATA[Padhi]]></Parameter> <Parameter Name="Parameter3" DatASource="XML"><![CDATA[Padhi]]></Parameter> <Parameter Name="Parameter4" datASource="XML"><![CDATA[Padhi]]></Parameter> <Node> <Node1 Name="Node1" Datasource="XML"><![CDATA[Sujeet]]></Node1> <Node2 Name="Node2" DataSource="XML"><![CDATA[Padhi]]></Node2> <Node3 Name="Node3" DatASource="XML"><![CDATA[Padhi]]></Node3> <Node4 Name="Node4" datASource="XML"><![CDATA[Padhi]]></Node4> </Node> </Process> '@ $XPath = "//*[@datasource='XML']" $Nodes = $GM_ProcessXML.SelectNodes($XPath) $Nodes
3 Réponses :
Vous pouvez également utiliser la notation de points insensibles de casse-insensibilité, comme ceci:
$Nodes = $GM_ProcessXML.Process.Parameter | Where-Object { $_.DAtaSourcE -eq 'xML' }
En fait, le XML est beaucoup plus complexe et j'ai besoin de tous les nœuds où la DataSource est XML. Donc je cherche un xpath. Édité le XML. @Theo
Short de modification des fichiers:
[xml]$GM_ProcessXML = @' <Process> <Parameter Name="Parameter1" Datasource="XML"><![CDATA[Sujeet]]></Parameter> <Parameter Name="Parameter2" DataSource="XML"><![CDATA[Padhi]]></Parameter> <Parameter Name="Parameter3" DatASource="XML"><![CDATA[Padhi]]></Parameter> <Parameter Name="Parameter4" datASource="XML"><![CDATA[Padhi]]></Parameter> <Node> <Node1 Name="Node1" Datasource="XML"><![CDATA[Sujeet]]></Node1> <Node2 Name="Node2" DataSource="XML"><![CDATA[Padhi]]></Node2> <Node3 Name="Node3" DatASource="XML"><![CDATA[Padhi]]></Node3> <Node4 Name="Node4" datASource="XML"><![CDATA[Padhi]]></Node4> </Node> </Process> '@ -replace 'datasource','datasource' $XPath = "//*[@datasource='XML']" $Nodes = $GM_ProcessXML.SelectNodes($XPath) $Nodes Name datasource #cdata-section ---- ---------- -------------- Parameter1 XML Sujeet Parameter2 XML Padhi Parameter3 XML Padhi Parameter4 XML Padhi Node1 XML Sujeet Node2 XML Padhi Node3 XML Padhi Node4 XML Padhi
Désolé pour la modification, cela a été complètement inattendu. (Je pensais éditer ma propre réponse, je ne faisais pas attention)
Bien entendu, en cours d'exécution des opérations de recherche et de remplacement sur XML est dangereuse (et fausse) et doit être évitée à tout prix.
Alors, sur la face de celui-ci, vous n'avez pas de chance. Mais il y a un travail autour de la combinaison de Code PowerShell et XPath Traduire () Code>. P>
translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')
Dans XML 2.0, vous pouvez le faire: "// * [minuscule (@DataSource) = 'XML']"