Page 1 sur 1
[R] Lecture et extraction valeurs d'un fichier XML
Posté : jeu. 17 déc. 2015 13:25
par Hugues
Bonjour,
Je souhaiterai lire et extraire des valeurs d'un fichier XML. Pour cela j'ai vu qu'il fallait l'UDF _XMLDomWrapper.au3, mais impossible de télécharger la dernière version ca le lien est mort...
Si quelqu'un à l'include dernière version, je suis preneur.
Merci par avance.
Re: [..]Lecture et extraction valeurs d'un fichier XML
Posté : jeu. 17 déc. 2015 13:53
par jguinch
dans le post d'origine, il y a 38 pages : la dernière contient un lien fonctionnel (#744) :
https://www.autoitscript.com/forum/topi ... m/?page=38
Re: [..]Lecture et extraction valeurs d'un fichier XML
Posté : jeu. 17 déc. 2015 14:01
par Hugues
Ok, merci. J'avais pas vu.
Re: [..]Lecture et extraction valeurs d'un fichier XML
Posté : jeu. 17 déc. 2015 18:10
par jguinch
De rien, il suffisait de prendre le temps de lire le post, c'est tout...
Pense à passer le sujet en [R] si c'est OK

Re: [..] Lecture et extraction valeurs d'un fichier XML
Posté : ven. 18 déc. 2015 09:23
par Hugues
J'ai encore une ou deux questions ^^. Voilà mon problème:
Je récupère plusieurs mots-clefs dans une ListView et à partir de ces mots, je veux récupérer les valeurs "associées" à ses mots-clefs dans un fichier XML.
Donc, faut-il utiliser l'UDF _XMLDomWrapper (je n'ai pas eu le temps de l'analyser ^^) ou bien préférer une recherche avec les expressions régulières?
Merci par avance de vos conseils.
Re: [..] Lecture et extraction valeurs d'un fichier XML
Posté : ven. 18 déc. 2015 09:47
par jguinch
Bin ça, ça dépend du fichier XML.
Si le fichier XML est basique et que l'attribut/noeud à lire est unique, un simple découpage de chaîne de caractères suffira (StringRegEx ou autre)
Si par contre il y a plusieurs attributs ou noeuds identiques, ça peut être nécessaire de parser le fichier XML avec les outils adaptés.
Il n'y a pas de règle, tout dépend de ton fichier XML et de ton besoin.
Si tu peux poster ton fichier XML, on pourra regarder ce qui paraît le plus simple.
Re: [..] Lecture et extraction valeurs d'un fichier XML
Posté : ven. 18 déc. 2015 14:23
par Hugues
Il y a plusieurs noeuds lol, voici un exemple de la structure (je ne peux pas le joindre, données confidentielles).
► Afficher le texte
Code : Tout sélectionner
<Cell...>
<Module....>
<Step name="[color=#0040BF][b]NameOf_1[/b][/color]">
<Step name="x1">
<Feature name="[color=#0040BF][b]Fmax[/b][/color]" OID="38940" SrcOID="4852" TID="9" FeatureType="Tolerance" ValPair="5E+02 2,5E+03" DispUnitConverter="kN" DispUnitConvVal="1E+03" CalcUnitConverter="kN" CalcUnitConvVal="1E+03"></Feature>
</Step>
</Step>
<Step name="[color=#0040BF][b]NameOf_2[/b][/color]">
<Step name="x2">
<Feature name="[color=#4000BF][b]Fmax[/b][/color]" OID="38940" SrcOID="4852" TID="9" FeatureType="Tolerance" ValPair="5E+02 2,5E+03" DispUnitConverter="kN" DispUnitConvVal="1E+03" CalcUnitConverter="kN" CalcUnitConvVal="1E+03"></Feature>
</Step>
</Step>
</Module>
</Cell>
Les données en bleues sont celles que je récupère de ma ListView, moi je veux récupérer les autres valeurs contenues dans <Feature>
Re: [..] Lecture et extraction valeurs d'un fichier XML
Posté : ven. 18 déc. 2015 15:05
par orax
Plusieurs façon de faire, je ne sais pas si ma méthode conviendra. C'est peut-être différent de ce que t'avais commencé donc désolé si ça t'embrouille...
Je n'ai pas utilisé l'UDF mais ça en revient au même, on peut remplacer des parties du code ci-dessous par des fonctions de l'UDF. L'UDF est juste un "wrapper" de ça =>
https://msdn.microsoft.com/en-us/librar ... 85%29.aspx
Pour récupérer ce qui m'intéresse dans le XML j'utilise une expression XPath.
► Afficher le texte
Code : Tout sélectionner
$oXmlDoc = ObjCreate('Msxml2.DOMDocument.6.0')
$oXmlDoc.load('temp.xml')
If $oXmlDoc.parseError.errorCode <> 0 Then
$oErr = $oXmlDoc.parseError
ConsoleWriteError($oErr.reason & @CRLF)
Exit 1
EndIf
$oXmlDoc.setProperty("SelectionLanguage", "XPath")
$oNode = $oXmlDoc.documentElement.selectSingleNode("/Cell/Module/Step[@name='NameOf_1']/Step/Feature/@name")
ConsoleWrite($oNode.nodeValue & @CRLF)
Re: [..] Lecture et extraction valeurs d'un fichier XML
Posté : ven. 18 déc. 2015 19:01
par Hugues
Merci, je regarde ça.
Pour le moment j'ai rien commencé.
Je préfère avoir l'avis d'expert avant de me lancer dans quelque chose que je ne maitrise pas ^^.
Re: [..] Lecture et extraction valeurs d'un fichier XML
Posté : mer. 30 déc. 2015 13:03
par Hugues
Bonjour,
J'ai réfléchi plus précisément à mes besoins.
Je voudrais au final, faire un TreeView de mon fichier XML dans une page HTML.
Le problème sera que la structure de mon fichier sera différent...
Si quelqu'un peu m'aiguiller, merci.
La structure de base est:
► Afficher le texte
<?xml version="1.0" encoding="UTF-8"?>
<root...>
<Type...>
<Component...>
<ComponentNo...>
<CompAttrVal...>/CompAttrVal>
</ComponentNo>
</Component>
....
</Type>
<Cell...>
<Module...>
<Step...>
<Step...>
<Feature...></Feature>
</Step>
</Step>
.......
</Module>
<MeasurementPoint...>
<Feature...></Feature>
<MeasurementPoint...>
</Cell>
</root>
EDIT (30/12/2015 13:01):
J'ai trouvé un code qui me décortique bien mon fichier XML:
► Afficher le texte
Code : Tout sélectionner
#include <_XMLDOMWrapper.au3>
#include <Array.au3>
$File = @ScriptDir & "\MonFichier.xml"
$TempFile = $File & ".temp.xml"
$TempData = StringReplace(FileRead($File), "xmlns", "xmlns1")
FileWrite($TempFile, $TempData)
$xml = _XMLFileOpen($TempFile)
If @error Then
ConsoleWrite(_XMLError() & @LF)
FileDelete($TempFile)
_Exit()
EndIf
Walk()
FileDelete($TempFile)
Func Walk($Path = ".")
$a = _XMLGetChildNodes($Path)
If IsArray($a) Then
For $x = 1 To $a[0]
If $x > 1 And $a[$x] <> $a[$x - 1] Then
Dim $num = 0
$num += 1
Else
$num = $x
EndIf
ConsoleWrite($Path & "/" & $a[$x] & "[" & $num & "]" & @LF)
Dim $at[1], $av[1]
$b = _XMLGetAllAttrib($Path & "/" & $a[$x] & "[" & $num & "]", $at, $av)
If Not @error Then
If IsArray($b) Then
For $y = 0 To UBound($at) - 1
If StringInStr($at[$y], "xmlns1") <> 0 Then $at[$y] = StringReplace($at[$y], "xmlns1", "xmlns")
ConsoleWrite(StringFormat("\t%s=%s\n", $at[$y], $av[$y]))
Next
EndIf
EndIf
Walk($Path & "/" & $a[$x] & "[" & $num & "]")
Next
EndIf
EndFunc
Func _Exit()
FileDelete($TempFile)
Exit
EndFunc
Re: [..] Lecture et extraction valeurs d'un fichier XML
Posté : mer. 30 déc. 2015 16:47
par orax
Je n'ai pas cet UDF donc j'ai repris mon code mais on peut remplacer des parties par des équivalences de l'UDF.
Pour parcourir l'arbre XML la fonction s'appelle elle-même (elle est récursive).
► Afficher le texte
Code : Tout sélectionner
$oXmlDoc = ObjCreate('Msxml2.DOMDocument.6.0')
$oXmlDoc.load(@ScriptDir & "\temp.xml")
If $oXmlDoc.parseError.errorCode <> 0 Then
$oErr = $oXmlDoc.parseError
ConsoleWriteError($oErr.reason & @CRLF)
Exit 1
EndIf
$oRoot = $oXmlDoc.documentElement
_childNodes($oRoot)
Func _childNodes($oNode)
$iLength = $oNode.childNodes.length
If $iLength Then
ConsoleWrite('<ul>' & @CRLF)
For $i = 0 To $iLength - 1
ConsoleWrite('<li>' & $oNode.childNodes.item($i).nodeName & '</li>' & @CRLF)
_childNodes($oNode.childNodes.item($i))
Next
ConsoleWrite('</ul>' & @CRLF)
EndIf
EndFunc ;==>_childNodes
Une fois collé dans un fichier HTML ça donne ça :
Code : Tout sélectionner
Type
Component
ComponentNo
CompAttrVal
CompAttrVal2
CompAttrVal3
Cell
Module
Step
Step
Feature
MeasurementPoint
Feature
Re: [..] Lecture et extraction valeurs d'un fichier XML
Posté : mer. 30 déc. 2015 17:53
par Hugues
Ok, j'ai essayé ca fonctionne plutôt pas mal, sauf qu'il faut que je récupère les autres valeurs contenues entre <>...
Un mixte des 2 codes serait parfait ^^, mais je suis trop gourmand lol
Re: [..] Lecture et extraction valeurs d'un fichier XML
Posté : mer. 30 déc. 2015 20:20
par orax
Je ne suis pas sûr de parfaitement comprendre quel est le résultat attendu. Ce qui serait bien c'est d'avoir un exemple de la page HTML voulue.
Re: [..] Lecture et extraction valeurs d'un fichier XML
Posté : mer. 30 déc. 2015 22:03
par Hugues
Ma page HTML sera "simplement" composée d'un TreeView (correspondant à la structure de mon fichier XML).
Je voudrais que ma page HTML ressemble à cela
http://i.stack.imgur.com/awW8v.png.
Après il faudra jouer avec le css ou jquery pour minimizer ou maximizer les dossier\sous dossier.
Re: [..] Lecture et extraction valeurs d'un fichier XML
Posté : lun. 04 janv. 2016 15:26
par Hugues
Salut, et meilleurs voeux pour cette année 2016 ^^
Je reviens à la charge ^^
J'ai modifié un chtio peu le code de orax, ça colle plutôt pas mal, mais je ne recupère pas toutes les valeurs contenues entre les balises...
Et vu que je ne connais pas le code pour recuperer toutes les valeurs entre les "nodes".
Merci par avance.
J'ai ajouté du css et la création d'un page HTML.
► Afficher le texte
Code : Tout sélectionner
#include <IE.au3>
Global $oIE, $sHTML
$oXmlDoc = ObjCreate('Msxml2.DOMDocument.6.0')
$oXmlDoc.load(@ScriptDir & "\monfichier.xml")
If $oXmlDoc.parseError.errorCode <> 0 Then
$oErr = $oXmlDoc.parseError
ConsoleWriteError($oErr.reason & @CRLF)
MsgBox(16, "XML Error", $oErr.reason & @CRLF & "Sortie du programme")
Exit 1
EndIf
_HTMLSheet()
$oRoot = $oXmlDoc.documentElement
_childNodes($oRoot)
_IEBodyWriteHTML($oIE, $sHTML)
Func _childNodes($oNode)
$iLength = $oNode.childNodes.length
If $iLength Then
$sHTML &= '<ul>' & @CRLF
For $i = 0 To $iLength - 1
$sHTML &= '<li>' & $oNode.childNodes.item($i).nodeName & '</li>' & @CRLF
_childNodes($oNode.childNodes.item($i))
Next
$sHTML &= '</ul>' & @CRLF
EndIf
EndFunc ;==>_childNodes
Func _HTMLSheet()
$oIE = _IECreate()
$hwndIE = _IEPropertyGet ($oIE, "hwnd")
$oBody = _IETagNameGetCollection($oIE, "body", 0)
$sHTML = @CRLF & "<!DOCTYPE HTML PUBLIC " & Chr(34) & "-//W3C//DTD HTML 4.01 Transitional//EN" & Chr(34) & @CRLF & @TAB & @TAB & Chr(34) & "http://www.w3.org/TR/html4/loose.dtd" & Chr(34) & ">" & @CRLF
$sHTML &= "<html>" & @CRLF
$sHTML &= "<head>" & @CRLF
$sHTML &= " <meta http-equiv=" & Chr(34) & "Content-Type" & Chr(34) & " content=" & Chr(34) & "text/html" & ";" & " charset=ISO-8859-1" & Chr(34) & ">" & @CRLF
$sHTML &= "<style type=" & Chr(34) & "text/css" & Chr(34) & ">" & @CRLF
$sHTML &= "td { white-space:nowrap; background-color:transparent; color:black; font-size:10pt; font-weight:normal; font-family:monospace,arial,sans-serif; border-width:thin; border-style:solid none none none; }" & @CRLF
$sHTML &= "body { background-color:transparent; color:Black; font-size:10pt; font-weight:normal; font-family:monospace,arial,sans-serif;height: 100%; }" & @CRLF
$sHTML &= "table#t01 tr:nth-child(even) {background-color: #eee;}" & @CRLF
$sHTML &= "table#t01 tr:nth-child(odd) {background-color: #fff;}" & @CRLF
$sHTML &= "ul" & @CRLF
$sHTML &= "{ list-style-type: none; }" & @CRLF
$sHTML &= "li" & @CRLF
$sHTML &= "{ font-size: 15x; }" & @CRLF
$sHTML &= "li:before" & @CRLF
$sHTML &= "{ content:'.';" & @CRLF
$sHTML &= "color: blue; " & @CRLF
$sHTML &= "font-size: 34px;" & @CRLF
$sHTML &= "}" & @CRLF
$sHTML &= "</style>" & @CRLF
$sHTML &= "</head>" & @CRLF
EndFunc
Re: [..] Lecture et extraction valeurs d'un fichier XML
Posté : mar. 05 janv. 2016 10:29
par Hugues
Bon, j'ai réussi à faire ce que je voulais ^^
Merci à tous pour votre aide.
Sujet résolu.