Zuordnen der Objekthierarchie zu XML-Daten

Wenn sich ein XML-Dokument im Speicher befindet, ist seine konzeptionelle Darstellung eine Struktur. Für das Programmieren verwenden Sie eine Objekthierarchie, um auf die Knoten der Struktur zuzugreifen. Im folgenden Beispiel wird veranschaulicht, wie aus dem XML-Inhalt Knoten werden.

Wenn der XML-Code in das Dokumentobjektmodell (DOM) eingelesen wird, werden die einzelnen Teile in Knoten umgesetzt, und diese enthalten zusätzliche Metadaten über sich selbst, z. B. ihren Knotentyp und ihre Werte. Der Knotentyp besteht aus seinem Objekt und bestimmt, welche Aktionen ausgeführt und welche Eigenschaften festgelegt oder abgerufen werden.

Angenommen, Sie haben folgenden einfachen XML-Code:

Eingabe

<book>  
    <title>The Handmaid's Tale</title>  
</book>  

Diese Eingabe wird im Speicher als die folgende Knotenstruktur mit der zugewiesenen Knotentypeigenschaft dargestellt:

example node tree
Darstellung von "book" und "title" in der Knotenstruktur

Das book-Element wird zu einem XmlElement-Objekt, ebenso wie das nächste Element, title, zu einem XmlElement, während der Elementinhalt zu einem XmlText-Objekt wird. Die Methoden und Eigenschaften von XmlElement unterscheiden sich von denen, die für ein XmlText-Objekt verfügbar sind. Folglich ist es wichtig, zu wissen, in welchen Knotentyp das XML-Markup umgesetzt wird, da der Knotentyp bestimmt, welche Aktionen ausgeführt werden können.

Im folgenden Beispiel werden XML-Daten eingelesen, und je nach Knotentyp wird unterschiedlicher Text ausgegeben. Dabei wird die folgende XML-Datendatei, items.xml, als Eingabe verwendet:

Eingabe

<?xml version="1.0"?>  
<!-- This is a sample XML document -->  
<!DOCTYPE Items [<!ENTITY number "123">]>  
<Items>  
  <Item>Test with an entity: &number;</Item>  
  <Item>test with a child element <more/> stuff</Item>  
  <Item>test with a CDATA section <![CDATA[<456>]]> def</Item>  
  <Item>Test with a char entity: A</Item>  
  <!-- Fourteen chars in this element.-->  
  <Item>1234567890ABCD</Item>  
</Items>  

Im folgenden Codebeispiel wird die Datei items.xml gelesen, dann werden für jeden Knotentyp Informationen angezeigt.

Imports System  
Imports System.IO  
Imports System.Xml  
  
Public Class Sample  
    Private Const filename As String = "items.xml"  
  
    Public Shared Sub Main()  
  
        Dim reader As XmlTextReader = Nothing  
  
        Try  
            ' Load the reader with the data file and
            'ignore all white space nodes.
            reader = New XmlTextReader(filename)  
            reader.WhitespaceHandling = WhitespaceHandling.None  
  
            ' Parse the file and display each of the nodes.  
            While reader.Read()  
                Select Case reader.NodeType  
                    Case XmlNodeType.Element  
                        Console.Write("<{0}>", reader.Name)  
                    Case XmlNodeType.Text  
                        Console.Write(reader.Value)  
                    Case XmlNodeType.CDATA  
                        Console.Write("<![CDATA[{0}]]>", reader.Value)  
                    Case XmlNodeType.ProcessingInstruction  
                        Console.Write("<?{0} {1}?>", reader.Name, reader.Value)  
                    Case XmlNodeType.Comment  
                        Console.Write("<!--{0}-->", reader.Value)  
                    Case XmlNodeType.XmlDeclaration  
                        Console.Write("<?xml version='1.0'?>")  
                    Case XmlNodeType.Document  
                    Case XmlNodeType.DocumentType  
                        Console.Write("<!DOCTYPE {0} [{1}]", reader.Name, reader.Value)  
                    Case XmlNodeType.EntityReference  
                        Console.Write(reader.Name)  
                    Case XmlNodeType.EndElement  
                        Console.Write("</{0}>", reader.Name)  
                End Select  
            End While  
  
        Finally  
            If Not (reader Is Nothing) Then  
                reader.Close()  
            End If  
        End Try  
    End Sub 'Main ' End class  
End Class 'Sample  
using System;  
using System.IO;  
using System.Xml;  
  
public class Sample  
{  
    private const String filename = "items.xml";  
  
    public static void Main()  
    {  
        XmlTextReader reader = null;  
  
        try  
        {  
            // Load the reader with the data file and ignore
            // all white space nodes.  
            reader = new XmlTextReader(filename);  
            reader.WhitespaceHandling = WhitespaceHandling.None;  
  
            // Parse the file and display each of the nodes.  
            while (reader.Read())  
            {  
                switch (reader.NodeType)  
                {  
                    case XmlNodeType.Element:  
                        Console.Write("<{0}>", reader.Name);  
                        break;  
                    case XmlNodeType.Text:  
                        Console.Write(reader.Value);  
                        break;  
                    case XmlNodeType.CDATA:  
                        Console.Write("<![CDATA[{0}]]>", reader.Value);  
                        break;  
                    case XmlNodeType.ProcessingInstruction:  
                        Console.Write("<?{0} {1}?>", reader.Name, reader.Value);  
                        break;  
                    case XmlNodeType.Comment:  
                        Console.Write("<!--{0}-->", reader.Value);  
                        break;  
                    case XmlNodeType.XmlDeclaration:  
                        Console.Write("<?xml version='1.0'?>");  
                        break;  
                    case XmlNodeType.Document:  
                        break;  
                    case XmlNodeType.DocumentType:  
                        Console.Write("<!DOCTYPE {0} [{1}]", reader.Name, reader.Value);  
                        break;  
                    case XmlNodeType.EntityReference:  
                        Console.Write(reader.Name);  
                        break;  
                    case XmlNodeType.EndElement:  
                        Console.Write("</{0}>", reader.Name);  
                        break;  
                }  
            }  
        }  
  
        finally  
        {  
            if (reader != null)  
                reader.Close();  
        }  
    }  
} // End class  

Die Ausgabe dieses Beispiels veranschaulicht die Zuordnung der Daten zu den Knotentypen.

Ausgabe

<?xml version='1.0'?><!--This is a sample XML document --><!DOCTYPE Items [<!ENTITY number "123">]<Items><Item>Test with an entity: 123</Item><Item>test with a child element <more> stuff</Item><Item>test with a CDATA section <![CDATA[<456>]]> def</Item><Item>Test with a char entity: A</Item><--Fourteen chars in this element.--><Item>1234567890ABCD</Item></Items>

Wenn Sie die Eingabe und die daraus generierte Ausgabe Zeile für Zeile betrachten, können Sie anhand der folgenden Tabelle untersuchen, welcher Knotentest welche Ausgabezeilen generiert hat. Dadurch lässt sich feststellen, welche XML-Daten in welchen Knotentyp umgesetzt wurden.

Eingabe Output Knotentyptest
<?xml-Version= „1.0“?> <?xml-Version= '1.0'?> XmlNodeType.XmlDeclaration
<!-- Dies ist ein XML-Beispieldokument --> <!-- Dies ist ein XML-Beispieldokument --> XmlNodeType.Comment
<!DOCTYPE-Elemente [<!ENTITY-Nummer „123“>]> <!DOCTYPE-Elemente [<!ENTITY-Nummer „123“>] XmlNodeType.DocumentType
<Elemente> <Elemente> XmlNodeType.Element
<Element> <Element> XmlNodeType.Element
Test mit einer Entität: &Nummer; Test mit einer Entität: 123 XmlNodeType.Text
</Element:> </Element:> XmlNodeType.EndElement
<Element> <Element> XmNodeType.Element
Test mit einem untergeordneten Element Test mit einem untergeordneten Element XmlNodeType.Text
<more> <more> XmlNodeType.Element
stuff stuff XmlNodeType.Text
</Element:> </Element:> XmlNodeType.EndElement
<Element> <Element> XmlNodeType.Element
test with a CDATA section test with a CDATA section XmlTest.Text
<![CDATA[<456>]]> <![CDATA[<456>]]> XmlTest.CDATA
def def XmlNodeType.Text
</Element:> </Element:> XmlNodeType.EndElement
<Element> <Element> XmlNodeType.Element
Test mit einer char-Entität: A Test mit einer char-Entität: A XmlNodeType.Text
</Element:> </Element:> XmlNodeType.EndElement
<!-- Vierzehn Zeichen in diesem Element.--> <--Vierzehn Zeichen in diesem Element.--> XmlNodeType.Comment
<Element> <Element> XmlNodeType.Element
1234567890ABCD 1234567890ABCD XmlNodeType.Text
</Element:> </Element:> XmlNodeType.EndElement
</Elemente> </Elemente> XmlNodeType.EndElement

Sie müssen wissen, welcher Knotentyp zugewiesen wird, da der Knotentyp steuert, welche Arten von Aktionen zulässig sind und welche Eigenschaften Sie festlegen und abrufen können.

Die Knotenerstellung für Leerraum wird gesteuert, wenn die Daten durch das PreserveWhitespace-Flag in das DOM geladen werden. Weitere Informationen finden Sie unter Behandlung von Leerräumen und signifikanten Leerräumen beim Laden des DOM.

Weitere Informationen zum Hinzufügen von neuen Knoten zum DOM finden Sie unter Einfügen von Knoten in ein XML-Dokument. Weitere Informationen zum Entfernen von Knoten aus dem DOM finden Sie unter Entfernen von Knoten, Inhalten und Werten aus einem XML-Dokument. Weitere Informationen zum Ändern des Inhalts von Knoten im DOM finden Sie unter Ändern von Knoten, Inhalten und Werten in einem XML-Dokument.

Siehe auch