Page 1 sur 1

Lecture dans fichier XML complexe

Posté : lun. 12 nov. 2018 12:13
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 !

Re: Lecture dans fichier XML complexe

Posté : ven. 23 nov. 2018 19:10
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.

Re: Lecture dans fichier XML complexe

Posté : ven. 23 nov. 2018 19:45
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:

Re: Lecture dans fichier XML complexe  

Posté : ven. 23 nov. 2018 21:29
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

Re: Lecture dans fichier XML complexe

Posté : ven. 23 nov. 2018 22:10
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 !

Re: Lecture dans fichier XML complexe

Posté : sam. 24 nov. 2018 08:24
par buggzbeny
and the winner is .... mdanielm !!!! :mrgreen: :mrgreen: :mrgreen:


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

Re: Lecture dans fichier XML complexe

Posté : sam. 24 nov. 2018 15:07
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

Re: Lecture dans fichier XML complexe

Posté : lun. 26 nov. 2018 12:35
par mdanielm
Génial Mickell, et pourtant ma méthode est plus rapide!