[R] Recherher un texte entre des balises

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
guillaume
Niveau 4
Niveau 4
Messages : 68
Enregistré le : mar. 28 août 2007 12:13
Status : Hors ligne

[R] Recherher un texte entre des balises

#1

Message par guillaume »

Bonjour,

Je cherche à liste le contenu des GPO d'un AD.

Je dispose d'une liste de fichier xml, dans ces fichiers se trouvent les infos que je recherche insérées entre des balises.

Par exemple pour le nom il faut que je cherche la ligne :
<Name>GPO-Firewall_VNC</Name>
le groupe :
<SOMName>Portables</SOMName>

et ainsi de suite..

Le soucis c'est que ces infos ne sont jamais à la même ligne dans mes fichiers xml.

Je pense qu'il faut que cherche du côté de la fonction "FileRead" pour trouver mes balises, mais après je ne sais pas comment récupérer ce qu'il y a entre.

Pouvez vous me donner une piste ?

Merci
Modifié en dernier par guillaume le dim. 14 mars 2010 20:32, modifié 1 fois.
Avatar du membre
Narmeke
Niveau 6
Niveau 6
Messages : 247
Enregistré le : mer. 28 oct. 2009 11:31
Localisation : Libourne
Status : Hors ligne

Re: [..] Recherher un texte entre des balises

#2

Message par Narmeke »

Ben remplace les balises pas "" :lol:
guillaume
Niveau 4
Niveau 4
Messages : 68
Enregistré le : mar. 28 août 2007 12:13
Status : Hors ligne

Re: [..] Recherher un texte entre des balises

#3

Message par guillaume »

je ne suis pas certain de comprendre :?
et j'ai déjà beaucoup de "" dans mon fichier.
Avatar du membre
Narmeke
Niveau 6
Niveau 6
Messages : 247
Enregistré le : mer. 28 oct. 2009 11:31
Localisation : Libourne
Status : Hors ligne

Re: [..] Recherher un texte entre des balises

#4

Message par Narmeke »

Voici une fonction que j'ai coder il y a a très peu de temps :

Code : Tout sélectionner

Func _DECOMPOSED_CONTACT_LIST()
$FILENAME = @TempDir&"\cl.txt"
    $CONTENU_FILENAME = FileRead($FILENAME)
    $SEARCH = '<number>'
    $REPLACE = ""
    $CONTENU_FILENAME = StringReplace($CONTENU_FILENAME, $SEARCH, $REPLACE)
    FileDelete($FILENAME)
    FileWrite($FILENAME, $CONTENU_FILENAME)
    ;---
    ;Suppression du texte après le texte entre balise
    ;---
    $CONTENU_FILENAME = FileRead($FILENAME)
    $SEARCH = '</number>'
    $REPLACE = ""
    $CONTENU_FILENAME = StringReplace($CONTENU_FILENAME, $SEARCH, $REPLACE)
    FileDelete($FILENAME)
    FileWrite($FILENAME, $CONTENU_FILENAME)
    ;---
    ;Suppression des espaces
    ;---
    $CONTENU_FILENAME = FileRead($FILENAME)
    $SEARCH = " "
    $REPLACE = ""
    $CONTENU_FILENAME = StringReplace($CONTENU_FILENAME, $SEARCH, $REPLACE)
    FileDelete($FILENAME)
    FileWrite($FILENAME, $CONTENU_FILENAME)
EndFunc ;=> _DECOMPOSED_CONTACT_LIST()
 
J'espère que cela peut vous aidez ^^

Cordialement Narmeke
guillaume
Niveau 4
Niveau 4
Messages : 68
Enregistré le : mar. 28 août 2007 12:13
Status : Hors ligne

Re: [..] Recherher un texte entre des balises

#5

Message par guillaume »

ok oui je comprends un peu mieux.

je vais essayer avec cette méthode.

Merci pour votre aide !
Davyly
Niveau 3
Niveau 3
Messages : 31
Enregistré le : dim. 08 févr. 2009 23:25
Status : Hors ligne

Re: [..] Recherher un texte entre des balises

#6

Message par Davyly »

Bonsoir,

Sans vouloir faire de l'ombre à "Narmeke" :wink: je te propose le code ci dessous en l'adaptant à tes besoins :

Code : Tout sélectionner

$fichier_xml = FileOpen(@ScriptDir & "\MonFichier.xml")
If $fichier_xml = -1 Then
    MsgBox(0, "Erreur", "Impossible d'ouvrir le fichier.")
    Exit
EndIf
$search = FileRead($fichier_xml)
FileClose($fichier_xml)
$val1 = StringRegExp($search, "<Name>([^<]+)<\/Name>", 1)
$val2 = StringRegExp($search, "<SOMName>([^<]+)<\/SOMName>", 1)
MsgBox(0, "Résultat", "GPO : " & $val1[0] & @CRLF & "Gatégorie : " & $val2[0])
 
MonFichier.xml
(5.24 Kio) Téléchargé 111 fois
Bonne soirée.
guillaume
Niveau 4
Niveau 4
Messages : 68
Enregistré le : mar. 28 août 2007 12:13
Status : Hors ligne

Re: [..] Recherher un texte entre des balises

#7

Message par guillaume »

whaou merci je n'en attendais pas tant !

Merci beaucoup je vais pouvoir faire mes tests
Avatar du membre
Narmeke
Niveau 6
Niveau 6
Messages : 247
Enregistré le : mer. 28 oct. 2009 11:31
Localisation : Libourne
Status : Hors ligne

Re: [R] Recherher un texte entre des balises

#8

Message par Narmeke »

Sa marche aussi, c'est même plus court xD
Merci :lol:
guillaume
Niveau 4
Niveau 4
Messages : 68
Enregistré le : mar. 28 août 2007 12:13
Status : Hors ligne

Re: [R] Recherher un texte entre des balises

#9

Message par guillaume »

ça fonctionne impec merci.

Par contre je recontre un souci avec certains fichiers xml qui comportent plusieurs balises <Name></Name>
Je n'avais pas pensé à ça, du coup ça me fait un message d'erreur.

Si vous avez idée je suis preneur !

Je vais voir si je peux pas lire le fichier par lignes et creer d'autres variables.
Davyly
Niveau 3
Niveau 3
Messages : 31
Enregistré le : dim. 08 févr. 2009 23:25
Status : Hors ligne

Re: [R] Recherher un texte entre des balises

#10

Message par Davyly »

Bonsoir,

Pas de souci, il suffit de modifier le flag de "StringRegExp" en "3", de récupérer le nombre de valeurs à l'aide d'un UBound. Ensuite, à toi de gérer la façon dont tu veux traiter le, les résultats.

En partant de mon premier exemple :

Code : Tout sélectionner

$fichier_xml = FileOpen(@ScriptDir & "\MonFichier.xml")
If $fichier_xml = -1 Then
    MsgBox(0, "Erreur", "Impossible d'ouvrir le fichier.")
    Exit
EndIf
$search = FileRead($fichier_xml)
FileClose($fichier_xml)
$val1 = _balise("Name")
$val2 = _balise("SOMName")
MsgBox(0, "Résultat", "GPO : " & $val1 & @CRLF & "Catégorie : " & $val2)
Func _balise($attribut)
    $val = @CRLF
    $myarray = StringRegExp($search, "<" & $attribut & ">([^<]+)<\/" & $attribut & ">", 3)
    For $i = 0 To UBound($myarray) - 1
        $val &= $myarray[$i] & @CRLF
    Next
    Return $val
EndFunc
 
MonFichier.xml
(5.32 Kio) Téléchargé 106 fois
Si souci, n'hésite pas à poster un exemple de ton fichier xml.

Bonne soirée.
guillaume
Niveau 4
Niveau 4
Messages : 68
Enregistré le : mar. 28 août 2007 12:13
Status : Hors ligne

Re: [R] Recherher un texte entre des balises

#11

Message par guillaume »

Merci beaucoup ! je vais mettre tout ça en place.
guillaume
Niveau 4
Niveau 4
Messages : 68
Enregistré le : mar. 28 août 2007 12:13
Status : Hors ligne

Re: [R] Recherher un texte entre des balises

#12

Message par guillaume »

J'ai réussi à faire ce que je voulais, merci à vous.

J'essai d'améliorer un peu mon script mais j'ai du mal à comprendre correctement la fonction :

Code : Tout sélectionner

Func _balise($attribut)
    $val = @CRLF
    $myarray = StringRegExp($search, "<" & $attribut & ">([^<]+)<\/" & $attribut & ">", 3)
    For $i = 0 To UBound($myarray) - 1
        $val &= $myarray[$i] & @CRLF
    Next
    Return $val
EndFunc
Cette fonction remplit bien son role mais j'ai du mal à bien comprendre son fonctionnement précis. (et j'aime bien comprendre chaque ligne d'un script :) )

En fait ce sont surtout les 2 lignes suivantes que je n'arrive pas à traduire :
For $i = 0 To UBound($myarray) - 1
$val &= $myarray[$i] & @CRLF

Comment peut on définir textuellement le role du "&" juste après $val ?
j'ai remarqué que quand je le retire je ne remonte que la dernière valeur de l'array.

Autre question, puis je modifier "For $i = 0 To UBound($myarray) - 1" pour par exemple ne remonter que la première valeur de l'array ? ou une que j'aurais défini en comptant au préalable le nombre total de valeur du tableau.


J'ai essayé de comprendre en lisant la doc, mais ça ne m'a pas beaucoup eclairci !

Désolé si ces questions vous paraissent bêtes.
Si vous pouvez faire quelque chose pour moi je vous en remercie !
Avatar du membre
bloodwolff
Membre émérite
Membre émérite
Messages : 655
Enregistré le : ven. 18 avr. 2008 22:36
Localisation : Québec
Status : Hors ligne

Re: [R] Recherher un texte entre des balises

#13

Message par bloodwolff »

guillaume a écrit : For $i = 0 To UBound($myarray) - 1
$val &= $myarray[$i] & @CRLF
For $i = 0 To : C'est simplement une boucle For standard donc je doute que plus d'information sont nécessaire

UBound() : Cette fonction sert à connaître les dimensions d'un tableau ou en d'autre mot le nombre d'élément qu'il contient ou plus précisement dans notre cas le nombre de balises qu'il a trouver

- 1 C'est une simple soustraction, car contrairement à une grande part des fonctions autoit les expressions régulières ne retourne pas le nombre d'élément dans l'index [0]. Nous devons simplement soustraire 1 car nous devons prendre en considération cette élément [0]. Par exemple un tableau de 3 élément se lira comme suit
$myarray[0] = premier élément
$myarray[1] = deuxième élément
$myarray[2] = troisième élément
Le tableau contient donc 3 élément mais tenter un tableau[3] résultera d'une erreur

$val &= C'est l'équivalent de "$val = $val &" donc cela ne qu'ajouter du texte à la suite du précédent

& @CRLF C'est un simple retour chariot, en résumé cela change de ligne
Autre question, puis je modifier "For $i = 0 To UBound($myarray) - 1" pour par exemple ne remonter que la première valeur de l'array ?
Relis plus haut dans mon message tu y trouveras ta joie :wink:
Compte skype : bloodwolfff
Répondre