Overblog Tous les blogs Top blogs Technologie & Science Tous les blogs Technologie & Science
Editer l'article Suivre ce blog Administration + Créer mon blog
MENU

autoreadxml

Publié le par damcuvelier

Pour lire n'importe quelle valeur ou trouver une valeur (ou les valeurs like n*me):

 

# usage:.\autoreadxml.ps1 -xmlfile <xml file fullname> -val "<value(s)* to find>" -node "<reference node>"
param($xmlfile, $val, $node)

# Vérifier si la valeur contient un astérisque et activer le mode 'like'
if ($val -match '\*') {$global:like = $true}

# Fonction pour chercher dans le fichier XML
function getxmlheaders {
    param($FileXml, $find, $node, [switch]$like)

    [xml]$GCXML = Get-Content $FileXml
    [string]$1stNodeName = $GCXML.DocumentElement.Name
    $XmlsubHeaders = ($GCXML.SelectNodes("//$1stNodeName/*") | Select-Object -Property Name -Unique).Name

    $result = @() # Initialisation d'un tableau pour stocker les résultats

    foreach ($XmlsubHeader in $XmlsubHeaders) {
        $props = ($GCXML.SelectNodes("//$1stNodeName/$XmlsubHeader/*") | Select-Object -Property Name -Unique).Name

        foreach ($prop in $props) {
            $value = ($GCXML.SelectSingleNode("//$1stNodeName/$XmlsubHeader/$prop")).InnerText

            # Vérifier les correspondances avec $node et les valeurs
            if (($XmlsubHeader.ToUpper() -eq $node.ToUpper()) -or ($prop.ToUpper() -eq $node.ToUpper())) {
                if ($like) {
                    if ($value.ToUpper() -like $find.ToUpper()) {$result += "$1stNodeName/$XmlsubHeader/$prop"}
                } else {
                    if ($value.ToUpper() -eq $find.ToUpper()) {$result += "$1stNodeName/$XmlsubHeader/$prop"}
                }
            }
        }
    }
    
return $result
}

# Fonction pour lire la valeur d'un chemin XML spécifique
function ReadXmlSpecPath {
    param($FileXml, $path)

    [xml]$xmlContent = Get-Content $FileXml
    
    # Sélectionner le nœud souhaité
    $node = $xmlContent.SelectSingleNode($path)

    # Retourner la valeur du nœud
    if ($node) {return $node.InnerText}
}

# Obtenir les chemins des valeurs recherchées
if ($like) {$subValuePaths = getxmlheaders -FileXml $xmlfile -find $val -node $node -like} 
else {$subValuePaths = getxmlheaders -FileXml $xmlfile -find $val -node $node}

# Si plusieurs résultats sont trouvés, les lire un par un
$resultat = @() # Initialisation d'un tableau pour les valeurs

if ($subValuePaths) {
    foreach ($subValuePath in $subValuePaths) {
        $XmlSubValue = ReadXmlSpecPath -FileXml $xmlfile -path $subValuePath
        $resultat += "$subValuePath/$XmlSubValue"
    }
}


return $resultat

Commenter cet article