Lecture dans fichier XML complexe

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
buggzbeny
Niveau 1
Niveau 1
Messages : 4
Enregistré le : lun. 12 nov. 2018 11:56
Status : Hors ligne

Lecture dans fichier XML complexe

#1

Message par buggzbeny » lun. 12 nov. 2018 12:13

Bonjour à tous,

Habitué à scripter en Autoit j'ai jusqu'à aujourd'hui toujours réussi à me débrouiller pour faire ce que je voulais mais la je coince.
J'ai deux types de fichier à lire, selon le système sur lequel l'autoit sera lancé.

L'idée est de retrouver le nom de la salle dans lequel le PC qui lance l'autoit se trouve, puis venir l'inscrire de manière automatique dans la partie commentaire du Windows.

Voici la version que j'avais faite pour un fichier de type .ini qui fonctionne parfaitement bien.

$cheminfichierini=@ScriptDir & "\gs_net.ini"


Local $description = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\LanmanServer\Parameters", "srvcomment")

Local $posteprof = StringInStr($description,"Poste Prof",0) ; on vérifie que le nom du poste n'est pas renseigné à la main

if $posteprof = 0 Then

        dim $ini = $cheminfichierini ; on place le fichier ini dans une variable pour éviter de le ré-écrire.


        $lopsection = IniReadSectionNames($ini) ; On place notre commande dans une variable

        For $j = 1 To $lopsection[0] ;on commence la boucle pour analyser ligne par ligne le fichier

                $lop = IniReadSection($ini,$lopsection[$j]) ; on appelle la commande placée dans une variable

                if      $lopsection[$j] = "POSTES" Then
                        For $i = 1 To $lop[0][0] ; on s'apprête à lire toutes les lignes de la section [POSTES]

                                if      $lop[$i][0]  = @ComputerName Then ; on cherche si le nom de poste est existant dans la section
                                        Local $salle =StringSplit($lop[$i][1],",")  ; on découpe la chaine de caractère pour récuperer le nom de la salle

                                        RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\LanmanServer\Parameters", "srvcomment", "REG_SZ", $salle[1]) ; on écrit la valeur dans la base de registre
                                EndIf
                        next
                endIf

        Next

EndIf


Sur un autre controleur de domaine, je dois également lire dans un fichier mais cette fois ci en format XML et faire la même chose. Voici un extrait du format du XML, car l'original est beaucoup plus long :
<?xml version="1.0" encoding="ISO-8859-1"?>
<ESU_LGM>
        <ListeGM>
                <GM nom="salle-admin_(w7-64)">
                        <ListeMachines>
                                <Machine>PC-00001-JSE</Machine>
                        </ListeMachines>
                        <ListeGestionnaires/>
                </GM>
                <GM nom="salle-a106_(w7-64)">
                        <ListeMachines>
                                <Machine>PC-00242-JSE</Machine>
                        </ListeMachines>
                        <ListeGestionnaires/>
                </GM>
                <GM nom="salle-a107_(w7-64)">
                        <ListeMachines>
                                <Machine>PC-00241-JSE</Machine>
                        </ListeMachines>
                        <ListeGestionnaires/>
                </GM>
                <GM nom="salle-a108_(w7-64)">
                        <ListeMachines>
                                <Machine>PC-00002-JSE</Machine>
                                <Machine>PC-00003-JSE</Machine>
                                <Machine>PC-00004-JSE</Machine>
                                <Machine>PC-00005-JSE</Machine>
                                <Machine>PC-00006-JSE</Machine>
                                <Machine>PC-00007-JSE</Machine>
                                <Machine>PC-00008-JSE</Machine>
                                <Machine>PC-00009-JSE</Machine>
                                <Machine>PC-00010-JSE</Machine>
                                <Machine>PC-00011-JSE</Machine>
                                <Machine>PC-00012-JSE</Machine>
                                <Machine>PC-00013-JSE</Machine>
                                <Machine>PC-00014-JSE</Machine>
                                <Machine>PC-00015-JSE</Machine>
                                <Machine>PC-00016-JSE</Machine>
                                <Machine>PC-00017-JSE</Machine>
                                <Machine>PC-00018-JSE</Machine>
                                <Machine>PC-00019-JSE</Machine>
                                <Machine>PC-00020-JSE</Machine>
                                <Machine>PC-00021-JSE</Machine>
                                <Machine>PC-00022-JSE</Machine>
                        </ListeMachines>
                        <ListeGestionnaires/>
                </GM>
                <GM nom="salle-a109_(w7-64)">
                        <ListeMachines>
                                <Machine>PC-00023-JSE</Machine>
                                <Machine>PC-00024-JSE</Machine>
                                <Machine>PC-00025-JSE</Machine>
                                <Machine>PC-00026-JSE</Machine>
                                <Machine>PC-00027-JSE</Machine>
                                <Machine>PC-00041-JSE</Machine>
                                <Machine>PC-00028-JSE</Machine>
                                <Machine>PC-00029-JSE</Machine>
                                <Machine>PC-00030-JSE</Machine>
                                <Machine>PC-00031-JSE</Machine>
                                <Machine>PC-00032-JSE</Machine>
                                <Machine>PC-00033-JSE</Machine>
                                <Machine>PC-00034-JSE</Machine>
                                <Machine>PC-00035-JSE</Machine>
                                <Machine>PC-00036-JSE</Machine>
                                <Machine>PC-00037-JSE</Machine>
                                <Machine>PC-00038-JSE</Machine>
                                <Machine>PC-00039-JSE</Machine>
                                <Machine>PC-00040-JSE</Machine>
                                <Machine>PC-00042-JSE</Machine>
                                <Machine>PC-00043-JSE</Machine>
                                <Machine>PC-00044-JSE</Machine>
                                <Machine>PC-00045-JSE</Machine>
                        </ListeMachines>
                        <ListeGestionnaires/>
                </GM>
        </ListeGM>
        <numeroSerie>PurbOMkeVKOiojj1tjYY0txlnjU=</numeroSerie>
        <ListeGestionnaires/>
</ESU_LGM>

Mon besoin est donc de retrouver en fonction du nom de l'ordinateur @Computername sur lequel se lance l'autoit, le nom de la salle dans laquelle il est et l'écrire dans la base de registre avec la commande :
RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\LanmanServer\Parameters", "srvcomment", "REG_SZ", $salle[1]) ; on écrit la valeur dans la base de registre
Merci d'avance pour votre aide !

Avatar du membre
mdanielm
Membre émérite
Membre émérite
Messages : 209
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: Lecture dans fichier XML complexe

#2

Message par mdanielm » ven. 23 nov. 2018 19:10

Bonsoir,
Je viens de voir ton post qui n'a pas eu de réponse.
Si ton problème n'est pas résolu, j'en fais mon affaire, si j'ai bien compris tu veux, par exemple:
PC-00004-JSE -------> salle-a108_(w7-64)

On peut utiliser une regex mais aussi des pointeurs dans la chaîne texte XML.
J'attends ta confirmation.

buggzbeny
Niveau 1
Niveau 1
Messages : 4
Enregistré le : lun. 12 nov. 2018 11:56
Status : Hors ligne

Re: Lecture dans fichier XML complexe

#3

Message par buggzbeny » ven. 23 nov. 2018 19:45

Bonsoir !

Non mon problème est pas résolu ! :?

Tu as très bien compris ma problématique ! C est exactement ça !

Le top du top serait de récupérer uniquement salle-a108
Le (w7-64) j en ai pas besoin ! Ça peut être autre chose que w7-64 mais dans tous les cas ça sera entre ()

En tout cas c’est vraiment sympa de ta part de m’aider :bisou: :bisou:

Avatar du membre
mdanielm
Membre émérite
Membre émérite
Messages : 209
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: Lecture dans fichier XML complexe  

#4

Message par mdanielm » ven. 23 nov. 2018 21:29

ConsoleWrite(MachineToSalle("PC-00012-JSE") & @crlf)

func MachineToSalle($Machine)
        ; $Machine de la forme "PC-ddddd-JSE"
        ; Retourne la salle sous la forme "salle-cc..c"  jusqu'à '_'

        Local $content = FileRead("fich.xml")
        Local $p = StringInStr($content, "<Machine>" & $machine & "</Machine>")
        If $p=0 Then Exit MsgBox(0, "ERR", $Machine & " n'est pas dans le fichier XML")

        ; On recule jusqu'à "<GM nom="
        Local $q = StringInStr($content, "<GM nom=", 0, -1, $p)

        ; On positionne $p sur le caractère qui suit ="
        $p = $q + 9 ; 9=stringLen('<GM nom="')

        ; On cherche '_' à partir de $p
        $q = StringInStr($content, '_', 0, 1, $p)

        ; On retourne les caractères entre $p et $q
        Return StringMid($content, $p, $q-$p)
EndFunc

buggzbeny
Niveau 1
Niveau 1
Messages : 4
Enregistré le : lun. 12 nov. 2018 11:56
Status : Hors ligne

Re: Lecture dans fichier XML complexe

#5

Message par buggzbeny » ven. 23 nov. 2018 22:10

:shock:

Déjà ???


:shock: :shock: :shock:


Alors la !!! :bisou: :bisou: :bisou: :bisou: :bisou: :bisou: :bisou:

Je teste ca en version grandeur nature et je reviens vers toi !

buggzbeny
Niveau 1
Niveau 1
Messages : 4
Enregistré le : lun. 12 nov. 2018 11:56
Status : Hors ligne

Re: Lecture dans fichier XML complexe

#6

Message par buggzbeny » sam. 24 nov. 2018 08:24

and the winner is .... mdanielm !!!! :mrgreen: :mrgreen: :mrgreen:


Encore une fois .... MERCI !!!!! :bisou: :D

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5780
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Lecture dans fichier XML complexe

#7

Message par mikell » sam. 24 nov. 2018 15:07

Pour l'anecdote (et pour le fun), la version regex

Msgbox(0,"", MachineToSalle("PC-00031-JSE") )

Func MachineToSalle($machine)
    $s = StringRegExpReplace(FileRead("fich.xml"), '(?s).*(salle[^_]+).*?' & $machine & '.*', "$1")
    Return @extended=0 ? "erreur" : $s
EndFunc
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

Avatar du membre
mdanielm
Membre émérite
Membre émérite
Messages : 209
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: Lecture dans fichier XML complexe

#8

Message par mdanielm » lun. 26 nov. 2018 12:35

Génial Mickell, et pourtant ma méthode est plus rapide!

Répondre