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 »

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 !
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: Lecture dans fichier XML complexe

#2

Message par mdanielm »

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 »

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:
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: Lecture dans fichier XML complexe  

#4

Message par mdanielm »

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 »

: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 »

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


Encore une fois .... MERCI !!!!! :bisou: :D
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Lecture dans fichier XML complexe

#7

Message par mikell »

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 )
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: Lecture dans fichier XML complexe

#8

Message par mdanielm »

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