Analyser le Fichier XML avec VBA
J'ai un fichier XML avec une structure semblable à ceci:
<egh_eval>
<eval_set>
<eval_id>FLOAT</eval_id>
<eval_d>
<height>INT</height>
<weight>INT</weight>
</eval_d>
<eval_e>
<height>INT</height>
<weight>INT</weight>
</eval_e>
<eval_cred>
<credit>FLOAT</credit>
</eval_cred>
</eval_set>
J'ai besoin d'analyser l'ensemble du dossier et le mettre dans un tableau. (Note: eval_d et eval_e fait de plus d'une centaine d'attributs de chaque). J'ai essayé d'utiliser MSXML2 cependant je me retrouve coincé lorsque j'essaie d'analyser le fichier. En utilisant les réponses à Comment pase XML en VBA et Parser XML en VBA j'ai pu y arriver :
Dim fSuccess As Boolean
Dim oDoc As MSXML2.DOMDocument
Dim oRoot As MSXML2.IXMLDOMNode ' Level 0 egh_eval
Dim oChild As MSXML2.IXMLDOMNode ' Level 1 eval_set
Dim oChildren As MSXML2.IXMLDOMNode ' Level 2 eval_id, eval_d, eval_e, eval_cred
Dim domList As MSXML2.IXMLDOMNodeList
Set oDoc = New MSXML2.DOMDocument
oDoc.async = False
oDoc.validateOnParse = False
fSuccess = oDoc.Load(Application.CurrentProject.Path & "\file.xml")
Set oRoot = oDoc.documentElement
Set oChild = oRoot.childNodes(0)
Set oChildren = oChild.childNodes(0)
For i = 0 To oChild.childNodes.length - 1
For y = 0 To oChildren.childNodes.length - 1
MsgBox oChildren.nodeName & " : " & oChildren.nodeTypedValue
oChildren.childNodes.nextNode
Next
oChild.childNodes.nextNode
Next
Cependant, au lieu de me donner les bonnes valeurs, il me donne le flotteur dans eval_id 4 fois...
Merci !
EDIT: je suis à l'aide de Microsoft Access 2002 SP3
La version de MS Access vous à l'aide de ( msdn.microsoft.com/en-us/library/ff823157.aspx ) ?
Je suis l'aide de microsoft access 2002 SP3. J'ai essayé le importXML méthode a cependant j'ai vraiment détesté la façon dont ça ferait une table séparée pour chacun de mes données au niveau 2. Toutes les données doivent être dans la même table. Aussi, je vais devoir contrôler le nom des colonnes où les données à un certain moment dans l'avenir.
Pouvez-vous montrer le résultat attendu?
Je suis l'aide de microsoft access 2002 SP3. J'ai essayé le importXML méthode a cependant j'ai vraiment détesté la façon dont ça ferait une table séparée pour chacun de mes données au niveau 2. Toutes les données doivent être dans la même table. Aussi, je vais devoir contrôler le nom des colonnes où les données à un certain moment dans l'avenir.
Pouvez-vous montrer le résultat attendu?
OriginalL'auteur Estarius | 2012-07-16
Vous devez vous connecter pour publier un commentaire.
Votre boucle est tout faux. N'utilisez pas compté boucle. Il est
For Each
qui fera exactement ce dont vous avez besoin, et c'est beaucoup plus lisible, trop.Lorsque vous utilisez
childNodes
vous devez vérifier lanodeType
de la propriété. Les commentaires, les nœuds de texte et ainsi de suite seront tous dans la liste des nœuds enfants, pas seulement les nœuds d'élément.Il pourrait être une bonne idée de regarder dans l'aide de XPath pour sélectionner vos éléments. De le faire avec les méthodes du DOM est sujette à erreur et lourd. Lire sur
IXMLDOMNode::selectNodes
etIXMLDOMNode::selectSingleNode
.Aussi, sur une note générale. Ce:
est effectivement pas nécessaire et une mauvaise idée, puisque vous ne semblez ne jamais vérifier la valeur de
fSuccess
). Mieux:De la création de plusieurs sous-marins/fonctions a plusieurs avantages
uniquement a une utilisation lorsque vous fournissez un Schéma XML qui définit les types de données. Ne l'utilisez pas si vous n'avez pas de schéma. Avant de continuer, s'il vous plaît confirmer que vous avez ne pas ont
On Error Goto 0
en effet.Je n'ai pas un on Error Goto encore... Que dois-je utiliser à la place de nodeTypedValue ? Parce que l' .longueur dans le code n'est pas vraiment l'information que je cherche, car il ne renvoie bien ... la longueur de la valeur
Bon. -- Je vous recommande d'utiliser
.text
. Le.length
est bien sûr le nombre de nœuds enfants et était destiné à servir comme un espace réservé pour tout ce que vous vraiment voulais faire. C'est une bonne idée de mettre un point d'arrêt dans le code et pas à travers, ligne par ligne, dans le débogueur. Inspecter tous les objets, leurs propriétés, et ainsi de suite. Aussi, avez-vous passé à XPath ou êtes-vous toujours jongler avecchildNodes
?Je suis toujours à l'aide de la childNodes, considérant qu'il y a des centaines d'attributs et de XPath semble me demander de spécifier chaque attribut... Il serait bon de faire la table réelle, mais très lourd pour simplement obtenir toutes les données du document XML dans une table
OriginalL'auteur Tomalak