Wir wünschen allen Forenteilnehmern ein frohes Fest und einen guten Rutsch ins neue Jahr. x

XML auslesen - untere Ebenen mit einbeziehen
#1
Hallo,

ich habe eine XML die ich gern auslesen und nur die Werte in ein Blatt schreiben möchte. Es gibt diverse leere Abgaben die ich nicht benötige.
Problem hier ist für mich, dass ich nicht weiß wie man die einzelnen Ebenen durchlaufen und auslesen kann. 

Ein kleiner Auszug aus einer XML Datei mit mehreren Ebenen. Es können weitere Ebenen vorhanden sein, die noch tiefer gehen.
Ich möchte "Basis_3" auslesen.

Code:
<?xml version="1.0" encoding="utf-8"?>
<asx:abap version="1.0" xmlns:asx="http://www......">
    <asx:values>
        <CORR_XML>
            <HEADER>
                <SYSID>XXX</SYSID>
                <MANDANT>0815</MANDANT>
                <DPCM_IDENT>aaaaaaaaaaaaaaaaaaaaaa</DPCM_IDENT>
                <CORR_AUTHORITY/>
                <REPRINT/>
                <DPCM_IDENT_ORIG/>
                <SYBATCH/>
                <BATCH_PRINT/>
                <COLLECT_PRINT/>
                <COLLECT_ALL>0</COLLECT_ALL>
                <COLLECT_POS>0</COLLECT_POS>
                <DRUCKJOB_IN_EX/>
            </HEADER>
            <BASIS_3>
                <ADRESSES>
                    <_-BASE-AA03_STR_XML_BASIS_ADDRESS>
                        <ADDRNUMBER>000200000</ADDRNUMBER>
                        <DATE_FROM>0001-01-01</DATE_FROM>
                        <DATE_TO>9999-12-31</DATE_TO>
                        <TITLE>0001</TITLE>
                        <NAME1>Villain</NAME1>
                        <NAME2>Ganon</NAME2>
                        <NAME3/>
                        <NAME4/>
                        <NAME_TEXT>Ganon Villain,</NAME_TEXT>
                        <NAME_CO/>
                        <CITY1>Hyrule</CITY1>
                        <CITY2/>
                        <HOME_CITY/>
                        <POST_CODE1>04711</POST_CODE1>
                        <POST_CODE2/>
                        <POST_CODE3/>
                        <PO_BOX/>
                        <PO_BOX_LOC/>
                        <STREET>Hyrule-Weg</STREET>
                        <TAB_OBG>
                            <_-GKV_-PR03_ORDNUNGSBEGRIFFE>
                                <PARTNER>123456789</PARTNER>
                                <IDENTIFICATIONTYPE>ABCDDE</IDENTIFICATIONTYPE>
                                <IDENTIFICATIONNUMBER>A999888777</IDENTIFICATIONNUMBER>
                                <IDINSTITUTE/>
                                <IDENTRYDATE>1900-01-01</IDENTRYDATE>
                                <IDVALIDFROMDATE>1900-01-01</IDVALIDFROMDATE>
                                <IDVALIDTODATE>9999-12-31</IDVALIDTODATE>
                            </_-GKV_-PR03_ORDNUNGSBEGRIFFE>
                            <_-GKV_-PR03_ORDNUNGSBEGRIFFE>
                                <PARTNER>123456789</PARTNER>
                                <IDENTIFICATIONTYPE>ABCD</IDENTIFICATIONTYPE>
                                <IDENTIFICATIONNUMBER>99300222D000</IDENTIFICATIONNUMBER>
                                <IDINSTITUTE/>
                                <IDENTRYDATE>1900-01-01</IDENTRYDATE>
                                <IDVALIDFROMDATE>1900-01-01</IDVALIDFROMDATE>
                                <IDVALIDTODATE>9999-12-31</IDVALIDTODATE>
                            </_-GKV_-PR03_ORDNUNGSBEGRIFFE>
                            <_-GKV_-PR03_ORDNUNGSBEGRIFFE>
                                <PARTNER>123456789</PARTNER>
                                <IDENTIFICATIONTYPE>DEFG</IDENTIFICATIONTYPE>
                                <IDENTIFICATIONNUMBER>053719996666</IDENTIFICATIONNUMBER>
                                <IDINSTITUTE/>
                                <IDENTRYDATE>1900-01-01</IDENTRYDATE>
                                <IDVALIDFROMDATE>1900-01-01</IDVALIDFROMDATE>
                                <IDVALIDTODATE>9999-12-31</IDVALIDTODATE>
                            </_-GKV_-PR03_ORDNUNGSBEGRIFFE>
                        </TAB_OBG>
                    </_-BASE-AA03_STR_XML_BASIS_ADDRESS>
                </ADRESSES>
            </BASIS_3>
        </CORR_XML>
    </asx:values>
</asx:abap>



Was ich bisher gemacht habe in VBA. Einlesen der XML als MSXML2.DOMDocument. Das klappt.


Code:
Sub TEST()

Dim fso As Object, oFile As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set oFile = fso.getfile(ThisWorkbook.Path & "\Forum.xml")

'### XML auslesen
Dim xmlObj As Object, nodesThatMatter As Object, _
Node As Object
Set xmlObj = CreateObject("MSXML2.DOMDocument")
xmlObj.async = False
xmlObj.validateOnParse = False
xmlObj.Load CStr(oFile)
           
Set nodesThatMatter = xmlObj.SelectNodes("//CORR_XML/Basis_3")

'Wie gehts es jetzt weiter?
For each node in nodesThatMatter '????
  .....
Next


Ich weiß das ist der kleinste Teil. Aber wie kann man die einzelnen ChildNodes und tieferen ChildNodes ALLE durchlaufen? Mir fehlt hier der Ansatz wie man das am besten macht. Hat jemand eine Idee oder Anregung für mich? 

Bin über jede Anregung, Link zu Webseiten dankbar.

VG 
Kinopio
Antworten Top
#2
Das sollte mit Power Query ganz einfach gehen!

Daten > Daten abrufen > Aus Datei > Aus XML
Antworten Top
#3
Hallo ws-53,

DANKE für Deine Idee. Habe ich probiert, bin ich aber nicht mit zufrieden. 

Bitte nicht wundern, zum Teil geht Deine Lösung aber nicht so schön wie ich es mir erhofft habe.
Meine Beispieldatei ist halt auch stark gekürzt und über "Daten" kam da kein Ergebnis raus mit dem ich zufrieden war wenn ich eine komplette Datei nehme.

Ich würde gern das XML per VBA aufarbeiten.  Ich hoffe jemand kann mir eine VBA Hilfestellung geben. 

VG

Kinopio
Antworten Top
#4
Hallo Kinopio,

dann lautet der Name des Elefantens im Raum nun ... Was genau erwartest Du denn als Ergebnis? Das weißt nämlich nur Du und ich bin mir sehr sicher, dass ein PQ Experte wie WS das Ergebnis "zusammenklicken" kann. Abgesehen davon kann auch niemand in Deinen Kopf gucken, der eine VBA Lösung unterstützen kann.

Viele Grüße,

Zwenn
Antworten Top
#5
Hallöchen,

Du müsstest das wahrscheinlich rekursiv durchlaufen. Ich hatte mal so was im Einsatz, im Prinzip

Code:
'--------------------------------------------------------------------
...
'Objekte
    Dim xmlRoot As MSXML2.IXMLDOMNode
    Dim xmlDoc As New MSXML2.DOMDocument
    Dim nNode As MSXML2.IXMLDOMElement
...
    xmlDoc.Load (strFilename)
...
    For Each nNode In xmlDoc.SelectNodes("...")
        Rekursiv_Auslesen nNode 'funktioniert mit nNode als Element und Node
...
'--------------------------------------------------------------------
Sub Rekursiv_Auslesen(xmlNode As MSXML2.IXMLDOMNode)
    Dim xmlTmp As MSXML2.IXMLDOMNode
    Dim xmlTmpElem As MSXML2.IXMLDOMElement
    Dim xmlAttribut As MSXML2.IXMLDOMAttribute              ' Einzelattribut
    Dim iCnt2%
    'Wenn das aktuelle Element ein Knoten ist...
    If xmlNode.NodeType = NODE_ELEMENT Then
        Set xmlTmpElem = xmlNode
        '....
    End If
    If xmlNode.HasChildNodes = True Then
        For Each xmlTmp In xmlNode.ChildNodes()
            'Rekursives Aufrufen der Funktion
            Rekursiv_Auslesen xmlTmp
        Next xmlTmp
    End If
End Sub
'--------------------------------------------------------------------

Ansonsten, "nicht so schön" mit PQ lässt sich vielleicht auch verbessern, im Forum gibt es durchaus PQ-Schönheitsschirurgen.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#6
@Zwenn - Danke für die Blumen!

Aber es gibt wohl die Möglichkeit, XML mit unsauberen Aufbau zu erstellen, der dann von PQ nicht korrekt aufgelöst wird. Ist die XML-Struktur jedoch korrekt, dann funktioniert es problemlos. Zumindest in den Fällen, die ich schon mal hatte.

Ich habe aber keine Tool, mit dem ich XML erzeugen kann. Bin also, um es testen zu können, darauf angewiesen, dass zu einer konkreten Fragestellung auch ein passendes XML-File zur Verfügung gestellt wird.
Antworten Top
#7
(03.11.2022, 10:36)ws-53 schrieb: Ich habe aber keine Tool, mit dem ich XML erzeugen kann. Bin also, um es testen zu können, darauf angewiesen, dass zu einer konkreten Fragestellung auch ein passendes XML-File zur Verfügung gestellt wird.

...da braucht es kein Tool. Kann mit jedem Texteditor erstellt werden. Muss nur als xml abgespeichert werden. Indirekt hat er das File über den mitgelieferten Code der xml Datei ja mitgeliefert. Trotzdem wäre es klüger gewesen, stattdessen das File direkt anzuhängen... 

PS: Wollte Dir das xml File mal hochladen, habe aber feststellen müssen, xml Files sind nicht erlaubt... deshalb also kein File... da war es doch ganz clever den den Inhalt als Code zu posten... 90

@ Kinopio,

wenn Du Basis3 auslesen möchtest, musst Du die Tabellen soweit extrahieren, bis Du an die gewünschten Daten kommst. Hab Dir das schnell mal zusammengeklickt, aber die Spalte Tab_Org (die eine weitere Tabelle zum expandieren enthält) noch drin gelassen, falls Du die noch brauchst. Ansonsten kannst Du die noch entfernen.

Code:
let
    Quelle = Xml.Tables(File.Contents("C:\Users\ich\OneDrive\Desktop\test.xml")),
    #"Entfernte Spalten" = Table.RemoveColumns(Quelle,{"Attribute:version"}),
    values = #"Entfernte Spalten"{0}[values],
    #"Namespace:" = values{0}[#"Namespace:"],
    CORR_XML = #"Namespace:"{0}[CORR_XML],
    BASIS_3 = CORR_XML{0}[BASIS_3],
    ADRESSES = BASIS_3{0}[ADRESSES],
    #"_-BASE-AA03_STR_XML_BASIS_ADDRESS" = ADRESSES{0}[#"_-BASE-AA03_STR_XML_BASIS_ADDRESS"],
    #"Geänderter Typ" = Table.TransformColumnTypes(#"_-BASE-AA03_STR_XML_BASIS_ADDRESS",{{"ADDRNUMBER", Int64.Type}, {"DATE_FROM", type date}, {"DATE_TO", type date}, {"TITLE", Int64.Type}, {"NAME1", type text}, {"NAME2", type text}, {"NAME3", type text}, {"NAME4", type text}, {"NAME_TEXT", type text}, {"NAME_CO", type text}, {"CITY1", type text}, {"CITY2", type text}, {"HOME_CITY", type text}, {"POST_CODE1", Int64.Type}, {"POST_CODE2", type text}, {"POST_CODE3", type text}, {"PO_BOX", type text}, {"PO_BOX_LOC", type text}, {"STREET", type text}})
in
    #"Geänderter Typ"
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.
Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.

Ciao, Ralf

Antworten Top
#8
... Zip ist erlaubt...
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#9
Man kann eine XML Datei händisch importieren (tab 'Developer')

In VBA:

Code:
Sub M_snb()
    ActiveWorkbook.XmlMaps("hash_Map").Import "G:\OF\test_000.xml"
End Sub
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#10
Hallo an alle die fleißig geantwortet haben.

@Zwenn: Anscheint habe ich es nicht ausreichend beschrieben, SORRY dafür. Ich verzichte aktuell erstmal darauf und beschäftige mich mit einem Vorschlag der auch gemacht wurde. Sollte ich damit nicht weiter kommen, würde ich mein Anliegen noch mal genauer beschreiben.

@schauan: Den Code nehme ich mal auseinander und probiere ihn für mich passend zu machen. Ich meine das klingt vielversprechend. VIELEN DANK!
Sehr schön finde ich den Begriff PQ-Schönheitschirurgen, da musste ich sehr schmunzeln.

@RalfA: Auch Dir danke für Deine Antwort. 

@snb: Das war mir neu und wieder was gelernt. DANKE!

@ws-53: Auch Dir DANKE für Deine Antwort.


Ich probiere mich mal nächste Woche damit zu beschäftigen.

VG und ein schönes Wochenende!

Kinopio
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste