Gib alle Knoten aus der XML-Datei, auch wenn Sie leer sind
Ich habe eine XML-Datei abgerufen werden über WSDL-Datei in Access 2010 per VBA. Die XML-Datei ist das sitzen in dieser variable
Dim xmlDoc As New DOMDocument60
Den Teil der XML, die ich bin daran interessiert, der aussieht wie die unten und im Grunde nur wiederholt sich für jeden UserBean
. Ein UserBean
ist im Grunde ein Benutzerkonto im system.
<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>
Das problem ist, dass nicht jedes Feld muss ausgefüllt werden.
Daher einige Knoten haben keine Daten
Mit dem MSXML2 Bibliothek in VBA gibt nur Knoten, wenn es wirklich text.
Also den code unten zurück, eine variable Anzahl von Knoten je nach dem, was jeder userbean enthält. Zum Beispiel, einige Benutzer haben nicht mobileNumber aufgefüllt.
Set nodes xmlDoc.selectNodes("//UserBean")
For Each node in nodes
debug.print node.text
next node
Den oben genannten code gibt eine lange Zeichenkette, in der alle Werte aller untergeordneten Knoten (mit Bezug auf die Userbean
Knoten), aber nur diejenigen, die text. Ich versuche, dies in eine Tabelle in Access und wenn einige Knoten fehlen einige Zeit, ich habe keine Möglichkeit, das zu prüfen... oder muss ich?
Wie kann ich wieder ALLE Knoten, ob Sie gefüllt sind oder nicht
ODER
Wie identifiziere ich die Namen der Knoten, der den text, damit ich weiß, wo Sie den Wert in die Tabelle in Access?
UPDATE
Weiter unten die Kommentare, was ich nach der ist eine Liste von Userbeans, die in sich selbst eine Liste...also in der Tat habe ich nach einer Liste von Listen...so in diesem Sinne habe ich versucht, das unten, aber es scheiterte an der ersten For Each
Schleife. Offensichtlich, dass die Art der Schleife nicht umgehen kann mithilfe von Listen, wie Sie einen Zähler für eine andere Liste. Gibt es eine Möglichkeit, um dieses?
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
debug.print node.nodename & "=" & node.text
Das ist in der Nähe @Tim Williams. Das Ergebnis des Codes wird
UserBean=4908414false614203Andrew....etc
also die Felder sind nicht gebrochen bekommen. Die UserBean
ist wirklich eine Liste von Knoten, die aber hier behandelt wie ein Knoten.Wenn überhaupt möglich,, spin-up eine SQL-server-engine -- es hat WEITAUS bessere XML-Kapazitäten als Zugang. FWIW.
sorry, was meinst du mit 'spin up eine SQL-server-engine'? Glücklich zu tun, dies in die effizienteste Art und Weise möglich.
Microsoft SQL-Server. Die Express-version enthält die vollständige syntax, und können leicht dienen als back-end zu einer einzigen desktop-Anwendung. Und wenn es ein multi-user-Zugriff Anwendung, Sie sollten wirklich die Migration zu einem zentralen Netzwerk-box.
InformationsquelleAutor zoonosis | 2013-05-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie denken, im Sinne von "Knoten", nicht "Listen."
selectNodes
gibt einen Zeiger auf eine Menge von Knoten, aber wenn Sie Durchlaufen wird, die Sie wind-up mit einer IXMLDOMNode, nicht eine Liste von Knoten. Sie kann nur eine nodeList durch den Aufruf der Methode, wie selectNodes.Können Sie zum Aufruf der selectNodes - wieder, oder benutzen Sie einfach das IXMLDOMNode ' s
childNodes
Eigenschaft, Auf MSDN dokumentiertBeachten Sie, dass mit einer korrekten XPath-Abfrage, Sie können nur wählen Sie eine Liste von Knoten, die Ihren Suchkriterien entsprechen. Und da dies in VBA, können Sie überspringen die explizite Deklarationen, es sei denn, Sie gehen zu nutzen Sie die intellisense.
badNode.name
solltebadNode.nodeName
aber weniger als die erforderliche Menge von Zeichen zu erzwingen, eine Bearbeitung.Ich habe versucht, sowohl Ihre Anregungen und beide funktionieren Super. Vielen Dank, ich habe viel gelernt von beiden Ansätzen. Sobald ich die Daten in eine Tabelle Ill post meine endgültige Lösung für alle zu teilen. Nochmals vielen Dank.
InformationsquelleAutor DougM