VBA - Darstellung der einzelnen Knoten und deren Wert aus XML
Habe ich eine einfache XML als unten, und ich anzeigen müssen den Namen jedes Knotens und seinen Wert. Kein element keine attribute.
<?xml version="1.0" encoding="UTF-8"?>
<ResponseEnvelope xmlns="http://www.nwabcdfdfd.com/messagin" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ResponseHeader>
<RequestId>directv_99e0857d-abf3-461c-913e-3ab59c6b5ef6</RequestId>
<ResponseId>1162969</ResponseId>
<MessageVersion>1.10</MessageVersion>
<RequestTimestamp>2013-02-12T17:26:28.172Z</RequestTimestamp>
<ResponseTimestamp>2013-02-12T17:26:50.409Z</ResponseTimestamp>
<SenderId>CarePortal2</SenderId>
<ProgramName />
<TestProdFlag>P</TestProdFlag>
<ResultCode>9</ResultCode>
<Locale>en_US</Locale>
<Errors>
<Error>
<ErrorCode>9</ErrorCode>
<ErrorNumber>90001</ErrorNumber>
<ErrorMessage>System error occurred</ErrorMessage>
<ErrorFieldId />
</Error>
</Errors>
</ResponseHeader>
<ResponseBody xsi:type="CPSingleSignOnResponse">
<PortalUserID>45497</PortalUserID>
<PartyID>1858186</PartyID>
<WarrantyItemName>DTV ABC WOLE HE P</WarrantyItemName>
<WarrantyInventoryItemId>138677</WarrantyInventoryItemId>
<ClientWarrantySku>202</ClientWarrantySku>
<ClientWarrantyDescription>DV Plan</ClientWarrantyDescription>
<ContractNumber>4003564</ContractNumber>
<IsPortalUserCreated>N</IsPortalUserCreated>
<IsPartyCreated>N</IsPartyCreated>
<IsContractUpdated>N</IsContractUpdated>
<IsFootPrintUpdated>N</IsFootPrintUpdated>
<Customer>
<PartyId>185812386</PartyId>
<Salutation />
<FirstName>Tejas</FirstName>
<LastName>Tanna</LastName>
<AddressList>
<Address>
<PartySiteId>3617490</PartySiteId>
<Type>BILTO</Type>
<Address1>CASCADES</Address1>
<Address2>202</Address2>
<Address3>RIDGE HEAVEN</Address3>
<Address4 />
<City>STERLING</City>
<State>VA</State>
<PostalCode>20165</PostalCode>
<County>LOUDOUN</County>
<Province />
<Country>US</Country>
<Urbanization />
<AddressStyle>US</AddressStyle>
</Address>
<Address>
<PartySiteId>3613791</PartySiteId>
<Type>SHIP_T</Type>
<Address1>CASADS</Address1>
<Address2>22</Address2>
<Address3>RIE HEEN</Address3>
<Address4 />
<City>STELI</City>
<State>VA</State>
<PostalCode>2065</PostalCode>
<County>LOUUN</County>
<Province />
<Country>US</Country>
<Urbanization />
<AddressStyle>US</AddressStyle>
</Address>
</AddressList>
<PhoneList>
<Phone>
<ContactPointId>2371717</ContactPointId>
<Type>HOME PNE</Type>
<PhoneNumber>51-62-7464</PhoneNumber>
<Country>1</Country>
<PrimaryFlag>Y</PrimaryFlag>
</Phone>
</PhoneList>
<EmailList>
<Email>
<ContactPointId>237516</ContactPointId>
<EmailAddress>[email protected]</EmailAddress>
<PrimaryFlag>Y</PrimaryFlag>
</Email>
</EmailList>
</Customer>
</ResponseBody>
</ResponseEnvelope>
Einzige Herausforderung hier ist, kann es einige Elemente, die möglicherweise sub-element in seinem eigenen z.B. Adresse So muss der code, um eine rekursive Funktion.
Auch die Elemente, die don ' T haben jeden text wie Address4(er hat nur die sub-Elemente) nicht angezeigt werden sollen. Auch die Elemente wie Provinz nicht angezeigt werden sollen.
Versuchte ich folgenden code, der aber nicht funktioniert..
Sub Driver()
Range("4:" & Rows.Count).ClearContents
Set xmlDoc = CreateObject("Microsoft.XMLDOM")
i = 4
xmlDoc.LoadXML (Range("A2"))
Set oParentNode = xmlDoc.DocumentElement.SelectNodes("ResponseBody")(0)
Call List_ChildNodes(oParentNode, i, "A", "B")
End Sub
Sub List_ChildNodes(oParentNode, i, NameColumn, ValueColumn)
For Each oChildNode In oParentNode.ChildNodes
If oChildNode.ChildNodes.Length > 1 Then
Call List_ChildNodes(oChildNode, i, NameColumn, ValueColumn)
Else
Cells(i, NameColumn) = oChildNode.tagname
Cells(i, ValueColumn) = oChildNode.Text
i = i + 1
End If
Next
End Sub
"es funktioniert nicht" - was ist die Fehlermeldung, die Sie bekommen? Was erwartest du als Ausgabe, und was sehen Sie?
Haben Sie concidered Xpath verwenden, um alle Elemente in den Knoten und dann einfach in einer Schleife durch die NodeList und abrufen der Informationen, die Sie benötigen?
Die Ausgabe soll in zwei msgboxes hier. Ersten sagen sollte, "Adresse: Adresse es hier geht" und 2. sollte man sagen "zu Hause: 123". (Gemäß der aktualisierten XML durch mich) bitte Können Sie Hilfe bei der Verwirklichung?
Die Verwendung von Xpath-wenn ich sage, Setzen Sie All_nodes = xmlDoc.SelectNodes("//*") es gibt auch Kontakt und PhoneList - Knoten, die ich nicht wollen, weil Sie don ' T haben jeden Text. Sie müssen nur sub-Elemente. Abhilfe bitte?
Haben Sie concidered Xpath verwenden, um alle Elemente in den Knoten und dann einfach in einer Schleife durch die NodeList und abrufen der Informationen, die Sie benötigen?
Die Ausgabe soll in zwei msgboxes hier. Ersten sagen sollte, "Adresse: Adresse es hier geht" und 2. sollte man sagen "zu Hause: 123". (Gemäß der aktualisierten XML durch mich) bitte Können Sie Hilfe bei der Verwirklichung?
Die Verwendung von Xpath-wenn ich sage, Setzen Sie All_nodes = xmlDoc.SelectNodes("//*") es gibt auch Kontakt und PhoneList - Knoten, die ich nicht wollen, weil Sie don ' T haben jeden Text. Sie müssen nur sub-Elemente. Abhilfe bitte?
Microsoft.XMLDOM
fast sicher falsch ist. Versuchen MSXML2.DOMDocument60
statt
InformationsquelleAutor Tejas | 2013-02-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorausgesetzt, Ihre XML-Daten in der Zelle "A2", das erste problem ist, dass Ihre Linie
Zurück
nothing
. Ändern Sie es zuund der code wenigstens etwas zu verarbeiten.
Das andere problem ist, dass ein Knoten-inside-a-Knoten geben nicht die richtige Ausgabe. Zur Adresse, die Sie brauchen, um Ihre
List_ChildNodes
- Funktion leicht. Die erste änderung, arbeitete für die Beispiele, die Sie zur Verfügung gestellt hatte, aber nicht für die späteren, die nicht korrekt analysiert mit dem code, den ich zuvor bereitgestellt. Also ich habe einen Fehler Falle, die dafür sorgt, dass auch diese XML gelesen wird (was ich glaube) korrekt. Der trick mitOn Error Resume Next
im wesentlichen ist das VBA-äquivalent zu einerTry ... Catch
Aussage (außer, dass der "Haken" ist: "set L null, wenn ein Fehler vorliegt. Eigentlich sind wir die Einstellung L auf null erste, und nicht überschreiben, dass Sie auf Fehler. Gleiche Sache, andere Reihenfolge. Einer dieser tricks, die Sie nicht unterrichten in der Schule!)Habe ich ausprobiert, die neueste version mit der größeren XML-fragment, das für Sie bereitgestellt, und es erschien zu analysieren, ohne eine Panne. Ich werde nicht durch Sie gehen Zeile für Zeile zu überprüfen...
Ich beobachtete die gleiche Sache, die Sie haben. Habe ich eine Bearbeiten, um den code - jetzt funktioniert es für mich. Bitte bestätigen, ob es das problem behebt für Sie.
Danke, aber noch ist es nicht perfekt. Finden Sie die aktualisierte XML. Ich habe eine Dummy-selbstschluss-Knoten. Code funktioniert nicht gut auf.
Antwortete ich Ihre Frage jetzt zweimal und dann ändern Sie das problem... Kann noch einen Blick in das morgen, aber das ist nicht wirklich, wie das funktioniert.
Tut mir sehr Leid, dass. Ich habe aktualisiert die fertige XML-Datei nun. Es wird nicht weiter verändern. Können Sie bitte helfen Sie mir Lesen Sie alle sub-Knoten RequestBody Knoten? ich bin wirklich dankbar für deine Hilfe bis jetzt. Ich fand java2s.com/Code/Php/XML/... hilfreich, aber nun können Sie es richtig.
InformationsquelleAutor Floris
Excel hat eine eingebaute .xml-importer. Sie nicht brauchen, um Ihr eigenes schreiben(es sei denn, Sie versuchen, etwas außergewöhnliches zu machen). http://office.microsoft.com/en-us/excel-help/import-xml-data-HP010206405.aspx#BMimport_an_xml_file_as_an_xml_list_wit
InformationsquelleAutor Stepan1010
Versuchen, diese version.
Hinweise:
Hier ist der code:
InformationsquelleAutor barrowc