2016-11-11 5 views
0

KontextExtract XML-Knoten-Namen in VBA

In einem Beispiel XML-Datei würden einige Daten in folgendem Format sein:

<A1> 
    <B1> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
    </B1> 
    <B2> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
    </B2> 
</A1> 
<A2> 
    <B1> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
    </B1> 
    <B2> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
    </B2> 
</A2> 

Meine Frage

I iterieren müssen die Knoten, um das folgende Ergebnis zu erhalten:

A1B1C1 
A1B1C2 
A1B1C3 
A1B2C1 
A1B2C2 
A1B2C3 

Ich habe viele Male versucht, aber konnte dieses Ergebnis nicht bekommen, kann mir jemand mit diesem Dank helfen.

+1

Sie versuchen, ein XML-Dokument in VBA zu analysieren, und ich muss sagen, dass Sie eine holprige Straße vor Ihnen haben , können Sie sich [dieses Thema] (http://stackoverflow.com/questions/11305/how-to-parse-xml-using-vba) und [dieses] (http://stackoverflow.com/) ansehen Fragen/21491736/How-to-XML-Datei-und-schreiben-in-Daten-dann-save-it. Das Analysieren von XML in VBA ist albtraumhaft, versuchen Sie sich auch XPath anzusehen, aber es gibt keinen praktischen Weg dazu. –

+0

Meinst du, wir können nicht in VBA ??? – user2155454

+0

Anscheinend hast du die Links, die ich zur Verfügung gestellt habe, nicht geöffnet, aber ich werde es dir trotzdem erklären. Sie können, aber es ist extrem schwierig und Sie müssen alle Arten von Bibliotheken und Tools verwenden, wie [XPath klicken Sie auf den Link] (https://msdn.microsoft.com/en-us/library/ms256086 (v = vs.110) .aspx). Versuchen Sie bitte, nach Antworten zu suchen und geben Sie uns etwas zum Kauen, sonst wird Ihr Beitrag wahrscheinlich gelöscht. –

Antwort

2

Zuerst würde ich empfehlen, die Bibliothek "Microsoft XML, vx.x" zu verwenden, wobei x für die neueste verfügbare Version steht (sollte 6.0 sein). Danach bist du gut zu gehen. Aber die Dinge, die man bei der Arbeit mit XML in VBA beachten sollte, sind zu weit gefasst, um sie in einer Antwort zu erfassen. Ich werde hier den Code liefern, obwohl Sie die gewünschte Ausgabe zu erhalten:

Sub parse_xml() 

    Dim XmlFileName As String: XmlFileName = "C:\Path\Filename.xml" 
    Dim XmlDocument As New MSXML2.DOMDocument60 
    Dim NodeA As IXMLDOMNode 
    Dim NodeB As IXMLDOMNode 
    Dim NodeC As IXMLDOMNode 

    XmlDocument.Load XmlFileName 

    For Each NodeA In XmlDocument.DocumentElement.ChildNodes 
     For Each NodeB In NodeA.ChildNodes 
      For Each NodeC In NodeB.ChildNodes 
       Debug.Print NodeC.ParentNode.ParentNode.BaseName & NodeC.ParentNode.BaseName & NodeC.BaseName 
      Next NodeC 
     Next NodeB 
    Next NodeA 

End Sub 

Bitte beachten Sie, dass ich Ihre Datei ein wenig zu erweitern, um eine gültige XML-Datei zu machen, die in die XmlDocument Variable geladen werden kann . Die XML-Datei ich für dieses Beispiel verwendet wird, ist die folgende:

<?xml version="1.0" encoding="UTF-8"?> 
<data> 
    <A1> 
    <B1> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
    </B1> 
    <B2> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
     </B2> 
    </A1> 
    <A2> 
    <B1> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
    </B1> 
    <B2> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
     </B2> 
    </A2> 
</data> 

Dies wird die folgende Ausgabe erzeugen (I Debug.Print nur verwendet, wie Sie sehen können):

A1B1c2 
A1B1c3 
A1B2c1 
A1B2c2 
A1B2c3 
A2B1c1 
A2B1c2 
A2B1c3 
A2B2c1 
A2B2c2 
A2B2c3 

Exkurs in der Ende: Im Gegensatz zu dem, was Pierre kommentiert habe, denke ich, dass das Parsen von XML in VBA die erreichbare Aufgabe ist. Aus meiner Erfahrung benötigen Sie nur die Bibliothek, die ich am Anfang des Posts empfohlen habe, um das eigentliche Parsen der Datei durchzuführen. Ich habe mit ziemlich komplexen XML-Dateien gearbeitet, die nur diese Bibliothek zum Parsen verwenden.

Edit: Dies ist der Code, dass nur Werte für die gewünschte Kriterium extrahieren:

Sub parse_xml() 

    Dim XmlFileName As String: XmlFileName = "C:\Path\Filename.xml" 
    Dim XmlDocument As New MSXML2.DOMDocument60 
    Dim NodeA As IXMLDOMNode 
    Dim NodeB As IXMLDOMNode 
    Dim NodeC As IXMLDOMNode 

    Dim DesiredA As String: DesiredA = "A2" 'Enter your desired A here 

    XmlDocument.Load XmlFileName 

    For Each NodeA In XmlDocument.DocumentElement.ChildNodes 
     If NodeA.BaseName = DesiredA Then 'This is the new line that selects your desired A 
      For Each NodeB In NodeA.ChildNodes 
       For Each NodeC In NodeB.ChildNodes 
        Debug.Print NodeC.ParentNode.ParentNode.BaseName & NodeC.ParentNode.BaseName & NodeC.BaseName 
       Next NodeC 
      Next NodeB 
     End If 'End of the If-Statement 
    Next NodeA 

End Sub 
+0

Danke, ich habe noch eine Anforderung .. Ich muss die 'B' und 'C' Werte von bestimmten 'A'.it finden, um anzunehmen, ich habe A1, A2, ....... A1000, in In diesem Fall muss ich die Daten von bestimmten A i bekommen.e A99 Die Daten sollten A99B1C1 A99B1C2 A99B1C3 A99B2C1 A99B2C2 A99B2C3 Ist es möglich, in VBA? Vielen Dank – user2155454

+0

Ja, es ist und es ist ganz einfach! Ich werde meine Antwort in ein paar Stunden entsprechend bearbeiten, wenn das für Sie in Ordnung ist. Wäre toll, wenn du meine Antwort dann als richtig markieren könntest! –

+0

Ok Ich habe gerade die Antwort bearbeitet. Hab das schnell gemacht, also hoffe ich es macht was du wolltest. Getestet auf meiner Maschine und es funktioniert gut. Prost! –