XML-Parser Wie komme ich an die Nodes?

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

CalcWeiss
**
Beiträge: 32
Registriert: Sa, 17.08.2013 13:26

XML-Parser Wie komme ich an die Nodes?

Beitrag von CalcWeiss »

Ich schreibe gerade mein Excel VBA auf OOO Basic um und hänge beim XML.

Die XML-Datei enthält Ergebnisse vom Programm MediaInfo.Exe und sieht ungefähr so aus:

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<Mediainfo version="0.7.58">
    <File>
        <track type="Video">
            <Width>320 pixels</Width>
            <Height>240 pixels</Height>
        </track>

        <track type="Audio">
            <Bit_rate_mode>Constant</Bit_rate_mode>
            <Bit_rate>16.0 Kbps</Bit_rate>
        </track>
    </File>
    <File>
        <track type="Video">
            <Width>480 pixels</Width>
            <Height>320 pixels</Height>
        </track>

        <track type="Audio">
            <Bit_rate_mode>Constant</Bit_rate_mode>
            <Bit_rate>16.0 Kbps</Bit_rate>
        </track>
    </File>
</Mediainfo>

Ich habe die Datei auf 2 EInträge <File> gekürzt und nur je 2 Einträge im Bereich Video und Audio belassen.
Mein Programm sieht momentan so aus:

Code: Alles auswählen

Sub test_GetXML
	oSFA = createUnoService("com.sun.star.ucb.SimpleFileAccess")
	oInStream = oSFA.openFileRead(file:///C:/test.xml)
	oDOM = createUnoService("com.sun.star.xml.dom.DocumentBuilder")
	oXML = oDOM.parse(oInStream)
	oInstream.closeInput
	
	oVideo = oXML.getElementsByTagName("Video")
End Sub
Ich möchte nun durch alle Files gehen und lediglich auf die untersten Elemente zugreifen also quasi auf die Elemente
File/Video/Width
File/Video/Height
File/Audio/Bit_rate
Meine Hänger sind
- wie komme ich von <File> zu <File> (in Excel ging das mit For Each xmlNodeFile In xmlNodeMedia.childNodes)
- wie komme ich an die nächste Ebene <track> (Excel: selectSingleNode, nextSibling)
- wie komme ich an die Eigenschaften?
Ich habe schon die Methoden getElementsByTagNameNS und getElementsByTagName gefunden, finde aber noch kein Beispiel, das mir erklärt, wie ich sie anwende. Hat jemand schon Erfahrung mit dem XML-Parser und kann mir hier etwas helfen?
Win-XP32, LO4.1.1.2 (en)
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: XML-Parser Wie komme ich an die Nodes?

Beitrag von DPunch »

Servus

Kommst Du mit diesem Beispielcode klar?

Code: Alles auswählen

   nodeListFiles = oXML.getElementsByTagName("File")
   sResult = ""
   For i=0 To nodeListFiles.Length - 1
		sResult = sResult & "File " & (i+1) & ": " & Chr(13)
		curFileNode = nodeListFiles.item(i)
		nodeListTracks = curFileNode.getElementsByTagName("track")
		For j=0 To nodeListTracks.Length - 1
			sResult = sResult & "Track " & (j+1)
			curTrackNode = nodeListTracks.item(j)
			If curTrackNode.hasAttributes Then
				sResult = sResult & " (Attributes:"
				nodeAttributes = curTrackNode.Attributes
				For k=0 To nodeAttributes.Length - 1
					sResult = sResult & " " & nodeAttributes.item(k).NodeName & "=" & nodeAttributes.item(k).Value
				Next k
				sResult = sResult & ")"
			End If
			sResult = sResult & Chr(13)
			If curTrackNode.hasChildNodes Then
				curChildNode = curTrackNode.firstChild
				Do While NOT isNull(curChildNode)
					If curChildNode.LocalName <> "" Then
						sResult = sResult & "   " & curChildNode.LocalName & " => " & curChildNode.firstChild.NodeValue & Chr(13)
					End If
					curChildNode = curChildNode.nextSibling
				Loop
			End If
		Next j
		sResult = sResult & "##################" & Chr(13)
   Next i
   MsgBox sResult
CalcWeiss
**
Beiträge: 32
Registriert: Sa, 17.08.2013 13:26

Re: XML-Parser Wie komme ich an die Nodes?

Beitrag von CalcWeiss »

Danke für den Beispielcode, den habe ich fast unverändert übernehmen können. Allein wäre ich nicht auf die Prozedur gekommen.

Jetzt habe ich noch ein kleines Problem mit fehlerhaften Zeichen im XML, z.B.
<Writing_library>LAME&#x06;õ#“</Writing_library>
was den Parser beendet. VBA (Excel) hat den einfach geschluckt.

Da werde ich wohl den Input Stream vorher noch vorverarbeiten müssen oder das XML vorher mittels Python-Script filtern.
Win-XP32, LO4.1.1.2 (en)
Antworten