Retour à tous les noeuds à partir du fichier XML, même lorsqu'ils sont vides
J'ai un fichier XML récupéré via WSDL dans Access 2010 via VBA. Le fichier XML est assis dans cette variable
Dim xmlDoc As New DOMDocument60
La partie du XML, je suis intéressé par ressemble au dessous et fondamentalement juste réitère pour chaque UserBean
. Un UserBean
est essentiellement un compte d'utilisateur dans un système.
<UserBean xsi:type="ns1:UserBean">
<primaryKey xsi:type="xsd:string">49084</primaryKey>
<updateIndex xsi:type="xsd:int">14</updateIndex>
<deleted xsi:type="xsd:boolean">false</deleted>
<loginID xsi:type="xsd:string">61420313556</loginID>
<name xsi:type="xsd:string">Andrew Mills</name>
<teams xsi:type="soapenc:Array" soapenc:arrayType="xsd:string[1]">
<string xsi:type="xsd:string">Maintenance</string>
</teams>
<timezone xsi:type="xsd:string">Australia/Brisbane</timezone>
<userTypePK xsi:type="xsd:string">3776</userTypePK>
<description xsi:type="xsd:string"/>
<emailAddress xsi:type="xsd:string"/>
<phoneNumber xsi:type="xsd:string"/>
<faxNumber xsi:type="xsd:string"/>
<pagerNumber xsi:type="xsd:string"/>
<mobileNumber xsi:type="xsd:string">61420313556</mobileNumber>
<securityQuestion xsi:type="xsd:string">__INVALID</securityQuestion>
<securityAnswer xsi:type="xsd:string"/>
<synchronisation xsi:type="soapenc:Array" soapenc:arrayType="ns2:SynchronisationBean[0]" xmlns:ns2="http://soap2.nads.econz.co.nz"/>
</UserBean>
Le problème est que pas tous les champs sont obligatoires à remplir.
Par conséquent, certains nœuds ont pas de données
À l'aide de la MSXML2 bibliothèque en VBA renvoie uniquement les nœuds si il est en fait un texte.
Donc le code ci-dessous sera de retour d'une quantité variable de nœuds en fonction de ce que chaque userbean contient. Par exemple, certains utilisateurs n'ont pas une mobileNumber peuplée.
Set nodes xmlDoc.selectNodes("//UserBean")
For Each node in nodes
debug.print node.text
next node
Le code ci-dessus renvoie une longue chaîne qui a toutes les valeurs de tous les nœuds enfants en elle (par rapport à la Userbean
nœud), mais seuls ceux qui ont de texte. J'ai essaye de mettre cela dans une table dans Access et si certains nœuds sont manquant de temps en temps, j'ai aucun moyen de retrouver... ou dois-je?
Comment puis-je retourner TOUS les nœuds qu'ils sont remplis ou non
OU
Comment puis-je identifier le nom du nœud qui a le texte donc je sais où mettre la valeur dans la table dans Access?
Mise à JOUR
Suite à la ci-dessous les commentaires, ce que je suis après une liste de Userbeans, qui sont eux-mêmes une liste...donc en fait je suis après une liste de listes...donc, avec cela à l'esprit, j'ai essayé le ci-dessous, mais il a échoué à la première For Each
boucle. Évidemment, ce type de boucle ne peut pas gérer à l'aide de listes comme un compteur pour une autre liste. Est-il un moyen de contourner cela?
Dim node As MSXML2.IXMLDOMNode
Dim userbeans As MSXML2.IXMLDOMNodeList
Dim userbean As MSXML2.IXMLDOMNodeList
Set userbeans = xmlDoc.selectNodes("//UserBean")
For Each userbean In userbeans '**Type mismatch error here**
For Each node In userbean
Debug.Print node.nodeName & ":" & node.Text
Next node
Next userbean
- Peut-être:
debug.print node.nodename & "=" & node.text
- C'est à proximité @Tim Williams. Le résultat de votre code est
UserBean=4908414false614203Andrew....etc
de sorte que les champs ne sont pas cassés. LeUserBean
est vraiment une liste de nœuds, mais ici son être traités comme un seul nœud. - Si possible, faire tourner un moteur SQL server -- il est de LOIN préférable XML capacités de l'Accès. FWIW.
- désolé, qu'entendez-vous par "faire tourner un moteur SQL server'? Heureux de faire cela de la manière la plus efficace possible.
- SQL Server de Microsoft. La version Express comprend la syntaxe complète, et peut facilement servir de back-end pour une seule application de bureau. Et si c'est un accès multi-utilisateur de l'application, vous devriez vraiment migrer vers un réseau central zone de.
Vous devez vous connecter pour publier un commentaire.
Vous devez penser en termes de "nœuds", pas "des listes."
selectNodes
renvoie un pointeur sur un ensemble de nœuds, mais quand vous itérer dessus vous vous retrouvez avec un IXMLDOMNode, pas un Nœud de la Liste. Vous ne pouvez obtenir une nodeList par l'appel d'une méthode, comme selectNodes.Vous pouvez appeler selectNodes nouveau, ou simplement utiliser le IXMLDOMNode de
childNodes
propriété, Documenté sur le site MSDNNotez qu'avec une bonne Requête XPath, il vous suffit de sélectionner une liste de nœuds qui correspondent à vos critères. Et puisque c'est VBA, vous pouvez sauter des déclarations explicites, sauf si vous allez profiter de l'intellisense.
badNode.name
devrait êtrebadNode.nodeName
mais son moins que le montant requis de caractères à appliquer une modification.