everest
Goto Top

Einlesen bestimmten Werten, Texten aus XML- Datei in EXCEL

Hallo Experten,

ich möchte in Excel die Werte/Texte aus einer XML-Datei direkt lesen ohne sie zu importieren. Kann jemand mir helfen?

Vielen Dank
Everest

Content-ID: 285961

Url: https://administrator.de/forum/einlesen-bestimmten-werten-texten-aus-xml-datei-in-excel-285961.html

Ausgedruckt am: 22.12.2024 um 15:12 Uhr

114757
114757 18.10.2015, aktualisiert am 19.10.2015 um 09:21:22 Uhr
Goto Top
Moin,
Und wat willste auslesen ? Bisschen wenig Info ...

Schon mal die Suchfunktion angeschmissen ?!
Aus einer XML-Datei mehrere Daten auslesen und in einer bestimmten Syntax in eine Excel-Datei speichern

Gruß jodel32
Everest
Everest 20.10.2015 um 22:27:03 Uhr
Goto Top
Hi Jodel32,

vielen Dank für die prompte Anwort. Ich habe deine Script-Datei genommen und ein bisschen modifiziert, aber es hat nicht geklappt. Sorry, ich bin kein Script-Profi face-sad
Meine .XML Datei schaut so aus:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/xsl' href='util/summary.xsl' ?>
<SUMMARY Version="2.0" Date="2015-10-18">
<HOST HostName="APP">
<OName Value="Microsoft Windows Server 2012 R2 Standard" />
<OServicePack Value="" />
<App1 Version="5.1.0" />
<App2 Version="5.0" />
<App3 Version="" />
<App4 Version="1.0.8.0" />
</HOST>
<HOST HostName="ANN">
<OName Value="Microsoft Windows Server 2008 R2 Standard " />
<OServicePack Value="Service Pack 1" />
<App1 Version="5.1.0" />
<App2 Version="5.0" />
<App3 Version="" />
<App4 Version="1.0.8.0" />
</HOST>
</SUMMARY>

Ich möchte quasi, den Hostname und OName, OSP, App1 bis App4 einlesen und in eine Tabelle schreiben. Diese Datei wird noch länger, aber immer die gleiche Schema. Das sollte so aussehen:

Hostname Start Date App1 App2 App3 App4

APP 2014 5.1.0
ANN

Ich bin sehr dankbar für deine Hilfe.
Vielen Dank.
Everest
colinardo
colinardo 21.10.2015, aktualisiert am 25.10.2015 um 19:19:18 Uhr
Goto Top
Hallo Everest,
Bitteschön face-wink
Sub ImportXML()
    Set XML = CreateObject("MSxml2.DOMDocument.6.0")  
    XML.Load ("C:\temp\demo.xml")  
    
    With ActiveSheet
        'Überschriften setzen  
        .Range("A1:F1").Value = Array("Hostname", "Start Date", "App1", "App2", "App3", "App4")  
        .Range("A1:F1").Font.Bold = True  
        'Anfangszelle setzen  
        Set rngOut = .Range("A2")  
        'Datum auslesen  
        Set summaryNode = XML.SelectSingleNode("/SUMMARY")  
        If Not summaryNode Is Nothing Then
            strDate = summaryNode.Attributes.getNamedItem("Date").Text  
        Else
            strDate = ""  
        End If
        'Host-Nodes auslesen  
        Set nodesHOST = XML.SelectNodes("/SUMMARY/HOST[contains(@HostName,'APP')]")  
        'Für jeden HOST-Node setze die entsprechenden Infos in eine neue Zeile  
        If Not nodesHOST Is Nothing Then
            For Each Node In nodesHOST
                strHostname = Node.Attributes.getNamedItem("HostName").Text  
                strApp1 = Node.SelectSingleNode("App1").Attributes.getNamedItem("Version").Text  
                strApp2 = Node.SelectSingleNode("App2").Attributes.getNamedItem("Version").Text  
                strApp3 = Node.SelectSingleNode("App3").Attributes.getNamedItem("Version").Text  
                strApp4 = Node.SelectSingleNode("App4").Attributes.getNamedItem("Version").Text  
                rngOut.Resize(1, 6).Value = Array(strHostname, strDate, strApp1, strApp2, strApp3, strApp4)
                Set rngOut = rngOut.Offset(1, 0)
            Next
        End If
    End With
    Set XML = Nothing
End Sub
Everest
Everest 21.10.2015 um 22:37:27 Uhr
Goto Top
Hi Colinardo,

Ich danke Dir. Es funktioniert prima mit meinem Test. Ich muss es nur noch mit einem echten .XML Datei mit mehreren Feldern testen. Das sollte kein problem sein oder?

Ich werde mich melden. Ich bin gespannt auf das Ergebniss.

Danke Dir nochmals und schönen Abend.
Everest.
colinardo
colinardo 22.10.2015 aktualisiert um 00:05:52 Uhr
Goto Top
Zitat von @Everest:
Ich muss es nur noch mit einem echten .XML Datei mit mehreren Feldern testen. Das sollte kein problem sein oder?
Definiere Felder ?
Mein Skript durchläuft in deiner XML Datei alle HOST Elemente welche direkte Kindelemente im DocumentElement Summary sind, und extrahiert die in deiner Beispieldatei genannten Unterelemente bzw. Attribute.
Ich werde mich melden. Ich bin gespannt auf das Ergebniss.
Danke Dir nochmals und schönen Abend.
Alles klar, wünsche ich ebenso...
Everest
Everest 25.10.2015 um 08:41:54 Uhr
Goto Top
Hi Colinardo,

nochmals herzlichen Dank für die Script. Es hat funktioniert. Ich habe 2 Fragen:

Zum Verständnis, die Feldername in meinem Script heißen anders, als sie hier dargestellt sind. Das Prinzip ist ja das gleiche.

1) Aus irgendeinem Grund, werden die Felder: StrOSName, strOSSPack, strApp6 beim Debuggen einen Fehler angezeigt: Runtime error (91), Object variable or Block variable not set. Ich habe es nicht rausgekriegt!

2) Ich möchte einen Filter setzen in "For Each Node in nodesHost", dass er nur die Hostnamen anzeigt, die Buchstaben "APP" findet. Z.B: MMMAPPNN, MMMTERNN

If Not nodesHOST Is Nothing Then

For Each Node In nodesHOST

strHostname = Node.Attributes.getNamedItem("HostName").Text
strOSName = Node.SelectSingleNode("OSName").Attributes.getNamedItem("Version").Text

strOSSPack = Node.SelectSingleNode("OSServicePack").Attributes.getNamedItem("Version").Text
strApp1 = Node.SelectSingleNode("App1").Attributes.getNamedItem("Version").Text

strApp2 = Node.SelectSingleNode("App2").Attributes.getNamedItem("Version").Text
strApp3 = Node.SelectSingleNode("App3").Attributes.getNamedItem("Version").Text
strApp4 = Node.SelectSingleNode("App4").Attributes.getNamedItem("Version").Text
strApp5 = Node.SelectSingleNode("App5").Attributes.getNamedItem("Version").Text
strApp6 = Node.SelectSingleNode("App6").Attributes.getNamedItem("Version").Text

rngOut.Resize(1, 9).Value = Array(strHostname, strOSName, strOSSPack, strApp1, strApp2, strApp3, strApp4, striApp5, strApp6)

Set rngOut = rngOut.Offset(1, 0)

Next

End If


Tausend Dank.
Everest
colinardo
colinardo 25.10.2015 aktualisiert um 16:22:53 Uhr
Goto Top
Zitat von @Everest:
Zum Verständnis, die Feldername in meinem Script heißen anders, als sie hier dargestellt sind. Das Prinzip ist ja das gleiche.
Solange der Aufbau und die Verschachtelung exakt gleich bleibt ja. Ansonsten ist immer Anpassung nötig.

1) Aus irgendeinem Grund, werden die Felder: StrOSName, strOSSPack, strApp6 beim Debuggen einen Fehler angezeigt: Runtime error (91), Object variable or Block variable not set. Ich habe es nicht rausgekriegt!
Dann Prüf als erstes die Groß- und Kleinschreibung der Elemente und Attribute, das diese übereinstimmen.
Ohne deine original XML ist hier die Fehlerursache schwer aufklärbar.
Falls du sie nicht veröffentlichen willst kannst du sie auch gerne via PM zuschicken.
2) Ich möchte einen Filter setzen in "For Each Node in nodesHost", dass er nur die Hostnamen anzeigt, die Buchstaben "APP" findet. Z.B: MMMAPPNN, MMMTERNN
Die Beschreibung ist leider etwas unverständlich...meinst du damit das du nur Nodes verarbeiten willst die den String: APP im Hostname enthalten ?? Denn dein zweites Beispiel enthält das ja nicht sondern stattdessen "TER" ???
Everest
Everest 25.10.2015 um 18:11:15 Uhr
Goto Top
Hi Colinardo,
zum Punkt 2) Du hast es richtig verstanden. Es gibt verschiedene Server Namen, nur welcher, den String APP hat soll angezeigt werden.

zum Punkt 1) Ich werde die Groß- Kleinschreibung nochmals prüfen.

Danke Dir.
Everest
colinardo
colinardo 25.10.2015 aktualisiert um 19:22:48 Uhr
Goto Top
Zitat von @Everest:

Hi Colinardo,
zum Punkt 2) Du hast es richtig verstanden. Es gibt verschiedene Server Namen, nur welcher, den String APP hat soll angezeigt werden.
Die XPath Query für die Hosts ist oben im Code entsprechend angepasst (Zeile 19)

Grüße und schönen Sonntagabend
Uwe
Everest
Everest 25.10.2015 um 20:43:45 Uhr
Goto Top
ich bedanke mich herzlich und wünsche Dir auch einen schönen Abend.

Gruss,
Everest
colinardo
Lösung colinardo 30.12.2015, aktualisiert am 31.12.2015 um 08:06:43 Uhr
Goto Top
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.

Guten Rutsch.