chef1568
Goto Top

Excel VBA XML-Nodes auslesen

Hallo zusammen,

ich lese eine XML-Datei mittels DOMDocument-Methode aus.

sub test()
       Dim xmlDoc As MSXML2.DOMDocument                'XML Datei  
	Dim xmlMessBloecke As IXMLDOMNodeList           'XML Knoten "Messwerteblöcke"  
	Dim xmlMessBlock As IXMLDOMNode                 'XML Unterknoten "Messwerteblock"  
	dim MWBbez

	Set xmlMessBloecke = xmlDoc.SelectSingleNode("Messwertebloecke").ChildNodes  

	For Each xmlMessBlock In xmlMessBloecke
		MWBbez = xmlMessBlock.SelectSingleNode("Messwerteblock").Text	'hier im Beispiel "_Version_1"  
	next
end sub

 <Messwertebloecke Anzahl="4">  
        <MWB Block="1">  
          <Messwerteblock>_Version_1</Messwerteblock>
          <Stelle Nr="1">  
            <NrBez>text_1</NrBez>
            <Wert />
            <Einheit />
            <Text>0 (decimal)</Text>
          </Stelle>
          <Stelle Nr="2">  
            <NrBez>text_2</NrBez>
            <Wert />
            <Einheit />
            <Text>1 (decimal)</Text>
          </Stelle>
          <Stelle Nr="3">  
            <NrBez>text_3</NrBez>
            <Wert />
            <Einheit />
            <Text>2 (decimal)</Text>
          </Stelle>
        </MWB>
        <MWB Block="2">  
          ...
          ...
        </MWB>
 </Messwertebloecke>


Ich möchte nun den Wert von <Text> aus der Stellenbezeichnung NrBez="text_2" auslesen.
Wie lässt sich das am einfachsten realisieren?

Ich würde gerne auch alle <Stellen> unter den <MWB> einzeln durchlaufen, jedoch kann ich diese leider nicht via "ChildNode" direkt ansprechen.
Die xmlMessBlockStellen und xmlMessBlockStelle ist immer NOTHING
<code >
sub test()
Dim xmlDoc As MSXML2.DOMDocument 'XML Datei
Dim xmlMessBloecke As IXMLDOMNodeList 'XML Knoten "Messwerteblöcke"
Dim xmlMessBlock As IXMLDOMNode 'XML Unterknoten "Messwerteblock"
dim MWBbez

Dim xmlMessBlockStellen As IXMLDOMNodeList 'XML Knoten "Messwerteblockstellen"
Dim xmlMessBlockStelle As IXMLDOMNode 'XML Unterknoten "Messwerteblockstelle"
dim MWBStelleBez

Set xmlMessBloecke = xmlDoc.SelectSingleNode("Messwertebloecke").ChildNodes

For Each xmlMessBlock In xmlMessBloecke
Set xmlMessBlockStellen = xmlMessBlock.SelectSingleNode("MWB").ChildNodes
MWBbez = xmlMessBlock.SelectSingleNode("Messwerteblock").Text 'hier im Beispiel "_Version_1"

For Each xmlMessBlockStelle In xmlMessBlockStellen
MWBStelleBez = xmlMessBlockStelle.SelectSingleNode("NrBez").Text 'hier im Beispiel ""
next
next
end sub


Danke und Gruß
Michael

Content-ID: 303856

Url: https://administrator.de/contentid/303856

Ausgedruckt am: 22.11.2024 um 22:11 Uhr

rubberman
rubberman 06.05.2016 um 14:31:49 Uhr
Goto Top
Hallo Michael.

Pfad und Name der Datei wären interessant, ebenso der Aufbau der XML Daten (nicht nur der gepostete Ausschnitt ist relevant). Ist "Messwertebloecke" der Rootknoten? Wenn nein, wie genau ist der Pfad zu "Messwertebloecke"? Warum versuchst du den Knoten "Messwertebloecke" mit "Messwerteblöcke" zu adressieren? Kann nur in die Hose gehen ...

Grüße
rubberman
chef1568
chef1568 06.05.2016 um 15:00:49 Uhr
Goto Top
Hallo rubberman,

<Messwertebloecke> ist nicht der Root. Jedoch habe ich die geposteten Snippets so angepasst. as wäre das der Rootknoten.
Grundsätzlich funktioniert ja das Auslesen mit der DOM-Methode - nur bei der speziellen Konstellation hier funktioiert es leider nicht wie gewünscht.

Nochmal zur Erläuterung was funktioniert:

Auslesen von "_Version_1" aus folgendem Pfad:

<Messwertebloecke Anzahl="4"><MWB Block="1"><Messwerteblock>_Version_1</Messwerteblock>
Set xmlMessBloecke = xmlDoc.SelectSingleNode("Messwertebloecke").ChildNodes  

For Each xmlMessBlock In xmlMessBloecke
     MWBbez = xmlMessBlock.SelectSingleNode("Messwerteblock").Text	'hier im Beispiel "_Version_1"  
next


Es funktioniert auch das Auslesen von "text_1" aus folgendem Stellen-Pfad:

<Messwertebloecke Anzahl="4"><MWB Block="1"><Stelle Nr="1"><NrBez>text_1</NrBez>
Set xmlMessBloecke = xmlDoc.SelectSingleNode("Stelle").ChildNodes  

For Each xmlMessBlockStelle In xmlMessBlockStellen
     dim test1, test2
     test1 = xmlMessBlockStelle.xmlMessBlockStelle.nodeName	'hier im Beispiel "NrBez"  
     test2 = xmlMessBlockStelle.xmlMessBlockStelle.text	                 'hier im Beispiel "text_1"  
next


Was leider nicht funktioniert ist:
Set xmlMessBloecke = xmlDoc.SelectSingleNode("MWB").ChildNodes  


--> Ich möchte alle "Stellen" einzeln durchlaufen und <NrBez> auf Inhalt prüfen
Wenn Inhalt gefunden: gebe die Bezeichnung aus
Wenn Inhalt nicht gefunden: prüfe next "Stelle"
colinardo
colinardo 06.05.2016 aktualisiert um 15:44:32 Uhr
Goto Top
Hallo chef1568,
Ich möchte alle "Stellen" einzeln durchlaufen und <NrBez> auf Inhalt prüfen
Wenn Inhalt gefunden: gebe die Bezeichnung aus
Wenn Inhalt nicht gefunden: prüfe next "Stelle"

Das erreichst du simplerweise direkt mit einer XPath-Query so:
For Each node In xmlDoc.selectNodes("//Messwertebloecke/MWB/Stelle")  
	set nodeNrBez = node.selectSingleNode("NrBez")  
	If Not nodeNrBez Is Nothing Then
		If nodeNrBez.text <> "" Then  
			MsgBox nodeNrBez.text
		End If
	End If
Next
Du kannst alternativ auch folgendes machen und direkt alle NrBz Knoten auslesen und ausgeben:
For Each node In xmlDoc.selectNodes("//Messwertebloecke/MWB/Stelle/NrBez")  
	If node.text <> "" Then  
		MsgBox node.text
	End If
Next
Brauchst du bei dieser Variante einen weiteren Knoten der selben Ebene kannst du ja über die Eigenschaft parentNode (node.parentNode) eine eben höher springen und die dort liegenden anderen Knoten auslesen.

Zur XPath-Selection-Syntax siehe: http://www.w3schools.com/xsl/xpath_syntax.asp

Grüße Uwe
rubberman
rubberman 06.05.2016 um 15:57:08 Uhr
Goto Top
Wie @colinardo schon gezeigt hat, greifst du auf ein Array gleichnamiger Knoten mit selectNodes() zu.

Grüße
rubberman