Anfängerhandbuch für XML DOM

Veröffentlicht: 13. Nov 2000 | Aktualisiert: 17. Jun 2004

Von Brian Randell

In diesem Artikel wird beschrieben, wie Sie mithilfe der XML DOM-Implementierung auf XML-Dokumente zugreifen und diese bearbeiten. Die Implementierung wird durch Microsoft® XML Parser offen gelegt.

Auf dieser Seite

Einführung Einführung
DOM-Definition DOM-Definition
Verwenden von XML DOM Verwenden von XML DOM
Laden eines Dokuments Laden eines Dokuments
Beheben von Fehlern Beheben von Fehlern
Abrufen von Informationen aus einem XML-Dokument Abrufen von Informationen aus einem XML-Dokument
Traversieren eines Dokuments Traversieren eines Dokuments
Weitere Schritte Weitere Schritte

Einführung

Nehmen wir an, Sie erhalten als Visual Basic®-Entwickler Daten in Form eines XML-Dokuments (Extensible Markup Language). In solch einem Fall müssen Sie die Informationen aus dem XML-Dokument herausziehen und die Daten in eigene Visual Basic-Lösungen integrieren. Sie können natürlich selbst Codeanweisungen schreiben, um den Inhalt der XML-Datei zu analysieren, da es sich eigentlich um eine Textdatei handelt. Dies ist jedoch nicht sehr produktiv, und außerdem wird eine der Stärken von XML außer Acht gelassen: die Möglichkeit, Daten strukturiert darzustellen.

Es ist besser, die Informationen mithilfe eines XML-Parsers aus XML-Dateien abzurufen. Ein XML-Parser besteht lediglich aus Software, die eine XML-Datei liest und die darin enthaltenen Daten verfügbar macht. Als Visual Basic-Entwickler sollten Sie einen Parser verwenden, der das XML DOM (Document Object Model) unterstützt. Im DOM sind Standardbefehle definiert, über die Parser verfügen sollten, damit Sie aus Ihren anderen Programmen auf den Inhalt von HTML- und XML-Dokumenten zugreifen können. Ein XML-Parser, der das DOM unterstützt, legt die Daten eines XML-Dokuments über eine Reihe von Objekten offen, die Sie für die Programmierung verwenden können. In diesem Artikel lernen Sie, wie Sie mithilfe der vom Microsoft® XML Parser (Msxml.dll) offen gelegten XML DOM-Implementierung auf XML-Dokumente zugreifen und diese bearbeiten.

Bevor Sie weiterlesen, sollten Sie sich die Rohversion einer XML-Datei ansehen, damit Sie erkennen, wie Sie sich die Arbeit mit einem Parser vereinfachen können. Die folgende Codeanweisung legt den Inhalt der Datei Cds.xml offen, die CD-Einträge enthält. Jeder Eintrag enthält Informationen wie den Interpreten, den Titel der CD und die Stücke.

<?xml version="1.0"?> 
<!DOCTYPE compactdiscs SYSTEM "cds.dtd"> 
<compactdiscs> 
  <compactdisc> 
    <artist type="Solist">Frank Sinatra</artist> 
    <title numberoftracks="4">In The Wee Small Hours</title> 
<tracks> 
<track>In The Wee Small Hours</track> 
<track>Mood Indigo</track> 
<track>Glad To Be Unhappy</track> 
<track>I Get Along Without You Very Well</track> 
</tracks> 
    <price>DM 24,99</price> 
  </compactdisc> 
  <compactdisc> 
    <artist type="Band">The Offspring</artist> 
    <title numberoftracks="5">Americana</title> 
<tracks> 
<track>Welcome</track> 
<track>Have You Ever</track> 
<track>Staring At The Sun</track> 
<track>Pretty Fly (For A White Guy)</track> 
</tracks> 
    <price>DM 24,99</price> 
  </compactdisc> 
</compactdiscs> 

In der zweiten Zeile dieses Dokuments wird auf eine externe DTD-Datei (DTD = Document Type Definition) verwiesen. Eine DTD-Datei definiert das Layout und den beabsichtigten Inhalt für eine bestimmte Art von XML-Dokument. Der XML-Parser kann eine DTD verwenden, um zu bestimmen, ob ein Dokument gültig ist. Dies ist aber nur eine Möglichkeit, wie Sie einen Parser beim Überprüfen eines Dokuments unterstützen können. Ein anderes Verfahren zum Überprüfen von Dokumenten, das sich immer größerer Beliebtheit erfreut, sind XML-Schemas. Sie definieren Schemas, indem Sie XML anstatt DTDs verwenden. Diese Schemas verwenden ihre eigene "interessante" Syntax.
Die folgende Codeanweisung zeigt den Inhalt der von Cds.xml verwendeten Datei Cds.dtd an:

<!ELEMENT compactdiscs (compactdisc*)> 
<!ELEMENT compactdisc (artist, title, tracks, price)> 
<!ENTITY % Type "Solist | Band"> 
<!ELEMENT artist (#PCDATA)> 
<!ATTLIST artist type (%Type;) #REQUIRED> 
<!ELEMENT title (#PCDATA)> 
<!ATTLIST title numberoftracks CDATA #REQUIRED> 
<!ELEMENT tracks (track*)> 
<!ELEMENT price (#PCDATA)> 
<!ELEMENT track (#PCDATA)> 

In diesem Artikel werden DTDs und XML-Schemata nicht erschöpfend behandelt. Die XML Schema-Sprache (in Englisch) basiert auf der XML-Data Note (in Englisch), einem Vorschlag, der dem W3C vorgelegt wurde.

 

DOM-Definition

Ein DOM für XML ist ein Objektmodell, das den Inhalt eines XML-Dokuments offen legt. In der Document Object Model (DOM) Level 1 Specification des W3C ist definiert, was ein DOM als Eigenschaften, Methoden und Ereignisse offen legen sollte. Die Microsoft-Implementierung des DOM unterstützt den W3C-Standard voll und verfügt über zusätzliche Features, die Ihnen die Arbeit mit XML-Dateien aus anderen Programmen erleichtern.

 

Verwenden von XML DOM

Sie verwenden das XML DOM, indem Sie eine Instanz eines XML-Parsers erstellen. Aus diesem Grund legt Microsoft das XML DOM über eine Reihe von COM-Standardschnittstellen in Msxml.dll offen. Die DLL Msxml.dll enthält die Typbibliothek und den Implementierungscode für die Arbeit mit XML-Dokumenten. Wenn Sie mit einem Scripting-Client wie VBScript in Internet Explorer arbeiten, verwenden Sie das DOM mithilfe der CreateObject-Methode, um eine Instanz des Parser-Objekts zu erstellen.

Set objParser = CreateObject( "Microsoft.XMLDOM" )

Wenn Sie VBScript über eine Active Server Page (ASP) ausführen, verwenden Sie Server.CreateObject.

Set objParser = Server.CreateObject( "Microsoft.XMLDOM" )

In Visual Basic können Sie auf das DOM zugreifen, indem Sie einen Verweis auf die MSXML-Typbibliothek einrichten, die sich in Msxml.dll befindet. So verwenden Sie MSXML aus Visual Basic 6.0:

  1. Öffnen Sie das Dialogfeld Verweise – ProjektX.

  2. Wählen Sie aus der Liste der verfügbaren COM-Objekte den Eintrag Microsoft XML, Version 2.0. Wenn Sie diesen Eintrag nicht finden, müssen Sie die MSXML-Bibliothek beschaffen.

  3. Dann können Sie eine Instanz des Parser-Objekts erstellen. Dim xDoc As MSXML.DOMDocument Set xDoc = New MSXML.DOMDocument

Woher bekommen Sie die Datei Msxml.dll? Es gibt zwei Möglichkeiten:

  • Sie können Internet Explorer 5.0 installieren. Der MSXML-Parser ist fester Bestandteil dieses Programms.

  • Sie können auch eine frei verfügbare Version des Microsoft XML-Parsers (in Englisch) downloaden.

Wenn Sie im Visual Basic-Projekt einen Verweis auf die Typbibliothek eingerichtet haben, rufen Sie den Parser auf, laden ein Dokument und arbeiten mit den Daten im Dokument.

Sie werden sich vielleicht fragen, womit Sie überhaupt arbeiten. Wenn Sie die MSXML-Bibliothek öffnen und das Objektmodell mithilfe des Visual Basic 6.0-Objektkatalogs untersuchen, werden Sie feststellen, dass das Objektmodell ziemlich umfangreich ist. In diesem Artikel wird gezeigt, wie Sie mithilfe der DOMDocument-Klasse und der IXMLDOMNode-Schnittstelle auf ein XML-Dokument zugreifen können.

Bild01

Abbildung 1. Objektmodell des MSXML-Parsers

 

Laden eines Dokuments

Wenn Sie ein XML-Dokument laden möchten, müssen Sie zuerst eine Instanz der DOMDocument-Klasse erstellen:

Dim xDoc As MSXML.DOMDocument 
Set xDoc = New MSXML.DOMDocument 

Nachdem Sie einen gültigen Verweis erhalten haben, öffnen Sie mithilfe der Load-Methode eine Datei. Der MSXML-Parser kann XML-Dokumente von einer lokalen Festplatte, mithilfe von UNC-Verweisen über das Netzwerk oder mittels eines URLs laden.
Wenn Sie ein Dokument von einer Festplatte laden möchten, erstellen Sie mit der Load-Methode das folgende Konstrukt:

If xDoc.Load("C:\Eigene Dateien\cds.xml") Then 
' Das Dokument wurde erfolgreich geladen. 
' Tun Sie an dieser Stelle etwas Interessantes. 
Else 
' Das Dokument konnte nicht geladen werden. 
End If 

Wenn Sie die Arbeit am Dokument beendet haben, müssen Sie den Objektverweis darauf freigeben. Der MSXML-Parser legt keine explizite Close-Methode offen. Das Beste, was Sie tun können, ist das explizite Festlegen des Verweises auf

Nothing

.

Set xDoc = Nothing 

Wenn Sie den Parser anweisen, eine Datei zu laden, erfolgt dieser Vorgang standardmäßig asynchron. Sie können dieses Verhalten ändern, indem Sie die boolesche Async-Eigenschaft des Dokuments bearbeiten. Dabei ist es wichtig, dass Sie die ReadyState-Eigenschaft eines Dokuments überprüfen, um sicherzustellen, dass ein Dokument bereit ist. Erst dann sollten Sie den Inhalt untersuchen. Die ReadyState-Eigenschaft kann einen von fünf möglichen Werten zurückgeben, wie unten angegeben:

Status

Wert

Nicht initialisiert: Der Ladevorgang hat noch nicht begonnen.

0

Laden: Die Methode zum Laden wird ausgeführt.

1

Geladen: Die Methode zum Laden ist abgeschlossen.

2

Interaktiv: Ein genügend großer Teil des DOM ist für die schreibgeschützte Prüfung bereit, und die Daten wurden nur teilweise analysiert.

3

Abgeschlossen: Die Daten wurden geladen und analysiert und stehen für Lese-/Schreibvorgänge zur Verfügung.

4

Der MSXML-Parser stellt Ereignisse bereit, die Sie beim Laden von großen Dokumenten verwenden können, um den Status des Ladevorgangs zu verfolgen. Diese Ereignisse sind auch nützlich, wenn Sie ein Dokument über einen URL asynchron über das Internet laden.

Wenn Sie eine Datei über einen URL laden möchten, müssen Sie den Speicherort der Datei mithilfe eines vollständigen URLs eingeben. Bei der Angabe des Pfades müssen Sie also das Präfix "http://" verwenden.

Dies ist ein Beispiel für das Laden einer Datei über einen URL:

xDoc.async = False 
If xDoc.Load("http://www.develop.com/hp/brianr/cds.xml") Then 
' Das Dokument wurde erfolgreich geladen. 
' Tun Sie an dieser Stelle etwas Interessantes. 
Else 
' Das Dokument konnte nicht geladen werden. 
End If 

Wenn Sie die Async-Eigenschaft des Dokuments auf

False

setzen, gibt der Parser die Steuerung erst dann an den Code zurück, wenn das Dokument vollständig geladen wurde und für die Bearbeitung bereit ist. Wenn Sie die Einstellung auf

True

lassen, müssen Sie die ReadyState-Eigenschaft vor dem Zugreifen auf das Dokument untersuchen. Oder Sie müssen die Ereignisse von DOMDocument verwenden, damit Sie eine Benachrichtigung im Code erhalten, wenn das Dokument bereit ist.

 

Beheben von Fehlern

Es kann mehrere Gründe haben, warum ein Dokument nicht geladen wird. Eine häufige Ursache ist, dass der Dokumentname nicht gültig ist, der an die Load-Methode übergeben wurde. Außerdem kann es sein, dass das XML-Dokument selbst nicht gültig ist.
Standardmäßig prüft der MSXML-Parser Ihr Dokument anhand einer DTD oder eines Schemas, wenn eines von diesen Verfahren im Dokument angegeben ist. Sie können den Parser anweisen, das Dokument nicht zu überprüfen, indem Sie die ValidateOnParse-Eigenschaft des DOMDocument-Objektverweises setzen, bevor Sie die Load-Methode aufrufen.

Dim xDoc As MSXML.DOMDocument 
Set xDoc = New MSXML.DOMDocument 
xDoc.validateOnParse = False 
If xDoc.Load("C:\Eigene Dateien\cds.xml") Then 
' Das Dokument wurde erfolgreich geladen. 
' Tun Sie an dieser Stelle etwas Interessantes. 
Else 
' Das Dokument konnte nicht geladen werden. 
End If 

Wir müssen Sie jedoch warnen, dass das Deaktivieren der Prüffunktion des Parsers in Produktionsanwendungen nicht zu empfehlen ist. Ein fehlerhaftes Dokument kann aus den verschiedensten Gründen dazu führen, dass Ihr Programm abstürzt. Das geringste Übel wäre, dass die Benutzer ungültige Daten erhalten.
Unabhängig vom Fehlertyp können Sie den Parser anweisen, Ihnen Fehlerinformationen zu liefern, indem Sie auf das ParseError-Objekt zugreifen. Richten Sie einen Verweis auf die IXMLDOMParseError-Schnittstelle des Dokuments ein, um mit den Eigenschaften des ParseError-Objekts arbeiten zu können. Die IXMLDOMParseError-Schnittstelle legt sieben Eigenschaften offen, die Sie verwenden können, um nach der Ursache des Fehlers zu forschen.
Das folgende Beispiel zeigt ein Meldungsfeld und alle Fehlerinformationen an, die über das ParseError-Objekt verfügbar sind.

Dim xDoc As MSXML.DOMDocument 
Set xDoc = New MSXML.DOMDocument 
If xDoc.Load("C:\Eigene Dateien\cds.xml") Then 
' Das Dokument wurde erfolgreich geladen. 
' Tun Sie an dieser Stelle etwas Interessantes. 
Else 
' Das Dokument konnte nicht geladen werden. 
Dim strErrText As String 
Dim xPE As MSXML.IXMLDOMParseError 
   ' Abrufen des ParseError-Objekts 
Set xPE = xDoc.parseError 
   With xPE 
   strErrText = "Your XML Document failed to load" & _ 
        "due to the following error." & vbCrLf & _ 
        "Error #: " & .errorCode & ": " & xPE.reason & _ 
        "Line #: " & .Line & vbCrLf & _ 
        "Line Position: " & .linepos & vbCrLf & _ 
        "Position In File: " & .filepos & vbCrLf & _ 
        "Source Text: " & .srcText & vbCrLf & _ 
        "Document URL: " & .url 
    End With 
    MsgBox strErrText, vbExclamation 
End If 
Set xPE = Nothing 

Sie können die vom ParseError-Objekt gelieferten Informationen verwenden, um Benutzern diese Informationen anzuzeigen, sie in einem Fehlerprotokoll aufzuzeichnen oder zu versuchen, den Fehler selbst zu beheben.

 

Abrufen von Informationen aus einem XML-Dokument

Wenn Sie ein Dokument geladen haben, müssen Sie als Nächstes die darin enthaltenen Informationen abrufen. Das Dokumentobjekt ist zwar wichtig, Sie verwenden aber zum größten Teil die IXMLDOMNode-Schnittstelle. Mit dieser Schnittstelle lesen und schreiben Sie in den einzelnen Knotenelementen. Bevor Sie etwas ausführen, müssen Sie verinnerlichen, dass der MSXML-Parser gegenwärtig 13 Knotentypen unterstützt. In der folgenden Tabelle sind einige der gebräuchlichsten Knotentypen aufgeführt.

DOM-Knotentyp

Beispiel

NODE_ELEMENT

<artist type="band">Offspring</artist>

NODE_ATTRIBUTE

<artist type="band">Offspring</artist>

NODE_TEXT

<artist type="band">Offspring</artist>

NODE_PROCESSING_INSTRUCTION

<?xml version="1.0"?>

NODE_DOCUMENT_TYPE

<!DOCTYPE compactdiscs SYSTEM "cds.dtd">

Sie greifen auf den Knotentyp über zwei Eigenschaften zu, die von der IXMLDOMNode-Schnittstelle offen gelegt werden. Die NodeType-Eigenschaft stellt eine Enumeration von DOMNodeType-Elementen bereit (einige sind in der obigen Tabelle aufgeführt). Zusätzlich können Sie NodeTypeString verwenden, um eine Textzeichenfolge für den Knotentyp abzurufen.
Wenn ein Verweis auf ein Dokument eingerichtet ist, können Sie mit dem Traversieren der Knotenhierarchie beginnen. Über den Dokumentverweis können Sie auf die ChildNodes-Eigenschaft zugreifen, die Ihnen einen Ansatzpunkt für den vertikalen Zugriff auf alle Knoten im Dokument gibt. Die ChildNodes-Eigenschaft legt das Element IXMLDOMNodeList offen, das das Visual Basic-Konstrukt For/Each unterstützt. Auf diese Weise können Sie alle einzelnen Knoten der ChildNodes-Eigenschaft aufzählen. Die ChildNodes-Eigenschaft stellt außerdem eine Level-Eigenschaft bereit, die die Anzahl an vorhandenen untergeordneten Knoten zurückgibt.
Nicht nur das Dokumentobjekt legt eine ChildNodes-Eigenschaft offen, sondern jeder einzelne Knoten. Dies erleichtert Ihnen in Verbindung mit der HasChildNodes-Eigenschaft von IXMLDOMNode das Traversieren der Knotenhierarchie zum Überprüfen von Elementen, Attributen und Werten.
Ein wichtiger Punkt ist die Beziehung (übergeordnet/untergeordnet) zwischen einem Dokumentelement und dem Wert des Elements. Im XML-Dokument mit den CDs legt das Element

<title>

einen Liedtitel offen. Wenn Sie den tatsächlichen Wert des Elements

<title>

abrufen möchten, müssen Sie nach Knoten vom Typ NODE_TEXT suchen. Wenn Sie einen Knoten mit passenden Daten gefunden haben, können Sie die Attribute untersuchen und über die ParentNode-Eigenschaft sogar auf den übergeordneten Knoten zugreifen.

 

Traversieren eines Dokuments

In einem XML-Dokument traversieren Sie die Knoten, die vom Dokumentobjekt offen gelegt werden. Da XML-Dokumente hierarchischer Natur sind, ist es relativ einfach, für das Traversieren des gesamten Dokuments eine rekursive Routine zu schreiben.
Die LoadDocument-Routine öffnet ein XML-Dokument. LoadDocument ruft dann eine andere Routine, nämlich DisplayNode, auf, die das Dokument dann tatsächlich traversiert. Dabei übergibt LoadDocument in Form eines Parameters und eines ganzzahligen Wertes einen Verweis auf die ChildNodes-Eigenschaft des momentan geöffneten Dokuments. Der Parameter und der Wert geben an, wo die Einzugsebene beginnt. Der Code verwendet den Indent-Parameter, um den Text im Visual Basic-Direktfenster der Dokumentstruktur zu formatieren.
Die DisplayNode-Funktion traversiert das Dokument, wobei besonders nach Knoten vom Typ NODE_TEXT gesucht wird. Wenn die Codeanweisung einen Knoten vom Typ NODE_TEXT findet, wird der Text des Knotens mithilfe der NodeValue-Eigenschaft abgerufen. Außerdem wird die ParentNode-Eigenschaft des aktuellen Knotens verwendet, um einen Rückverweis auf einen Knoten vom Typ NODE_ELEMENT zu erhalten. Knoten vom Typ NODE_ELEMENT legen eine NodeName-Eigenschaft offen. Der jeweilige Inhalt von NodeName und NodeValue wird angezeigt.
Wenn ein Knoten über untergeordnete Elemente verfügt, die über die HasChildNodes-Eigenschaft bestimmt werden können, ruft DisplayNode sich selbst rekursiv auf, bis das Ende des Dokuments erreicht ist.
Die DisplayNode-Routine schreibt die Informationen mithilfe von Debug.Print in das Visual Basic-Direktfenster:

Public Sub LoadDocument() 
Dim xDoc As MSXML.DOMDocument 
Set xDoc = New MSXML.DOMDocument 
xDoc.validateOnParse = False 
If xDoc.Load("C:\Eigene Dateien\beispiel.xml") Then 
' Das Dokument wurde erfolgreich geladen. 
' Tun Sie an dieser Stelle etwas Interessantes. 
DisplayNode xDoc.childNodes, 0 
Else 
' Das Dokument konnte nicht geladen werden. 
' Fehlerinformationen finden Sie in der vorherigen Liste. 
End If 
End Sub 
Public Sub DisplayNode(ByRef Nodes As MSXML.IXMLDOMNodeList, _  
ByVal Indent As Integer) 
Dim xNode As MSXML.IXMLDOMNode 
Indent = Indent + 2 
For Each xNode In Nodes 
If xNode.nodeType = NODE_TEXT Then 
Debug.Print Space$(Indent) & xNode.parentNode.nodeName & _ 
":" & xNode.nodeValue 
End If 
If xNode.hasChildNodes Then 
DisplayNode xNode.childNodes, Indent 
End If 
Next xNode 
End Sub 

DisplayNode verwendet die HasChildNodes-Eigenschaft, um zu bestimmen, ob sie sich erneut selbst aufrufen soll. Sie können auch die Level-Eigenschaft des Knotens verwenden und nach einem Wert suchen, der größer als 0 ist.

 

Weitere Schritte

Dieser Artikel ist nur als kurzer Einblick gedacht. Sie verfügen jetzt über die Grundvoraussetzungen für die Erweiterung Ihres Wissens im Bereich XML und MSXML-Parser. Sie können viele interessante Schritte ausführen, z.B. die Werte einzelner Knotenelemente aktualisieren, innerhalb eines Dokuments eine Suche durchführen, Ihre eigenen Dokumente erstellen usw. Weitere Beispiele, Artikel und Downloads finden Sie unter MSDN Online XML Developer Center (in Englisch).