0
votes

PowerShell - XPath for case Insensible XML Attribut Nom

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


1 commentaires

Dans XML 2.0, vous pouvez le faire: "// * [minuscule (@DataSource) = 'XML']"


3 Réponses :


0
votes

Vous pouvez également utiliser la notation de points insensibles de casse-insensibilité, comme ceci:

$Nodes = $GM_ProcessXML.Process.Parameter | Where-Object { $_.DAtaSourcE -eq 'xML' }


1 commentaires

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



0
votes

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


2 commentaires

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.



0
votes
  • Il n'y a pas de comparaison de chaîne insensible à la caisse dans XPath 1.0 LI>
  • XPath 1.0 est tout ce qui est disponible dans .NET LI>
  • PowerShell est basé complètement sur .NET LI>

    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')
    


0 commentaires