Mappa objekthierarkin till XML-data

När ett XML-dokument finns i minnet är den konceptuella representationen ett träd. För programmering har du en objekthierarki för att komma åt noderna i trädet. I följande exempel visas hur XML-innehållet blir noder.

När XML-koden läses in i XML-dokumentobjektmodellen (DOM) översätts delarna till noder och dessa noder behåller ytterligare metadata om sig själva, till exempel deras nodtyp och värden. Nodtypen är dess objekt och är det som avgör vilka åtgärder som kan utföras och vilka egenskaper som kan anges eller hämtas.

Om du har följande enkla XML:

Indata

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

Indata representeras i minnet som följande nodträd med egenskapen tilldelad nodtyp:

example node tree
Trädrepresentation för bok- och rubriknod

Elementet book blir ett XmlElement-objekt , nästa element, title, blir också ett XmlElement, medan elementinnehållet blir ett XmlText-objekt . När du tittar på XmlElement-metoderna och egenskaperna skiljer sig metoderna och egenskaperna från de metoder och egenskaper som är tillgängliga för ett XmlText-objekt . Det är därför viktigt att veta vilken nodtyp XML-markeringen blir, eftersom dess nodtyp avgör vilka åtgärder som kan utföras.

Följande exempel läser i XML-data och skriver ut annan text, beroende på nodtyp. Med följande XML-datafil som indata items.xml:

Indata

<?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>  

Följande kodexempel läser items.xml-filen och visar information för varje nodtyp.

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  

Utdata från exemplet visar mappningen av data till nodtyperna.

Output

<?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>

Genom att ta indata en rad i taget och använda utdata som genererats från koden kan du använda följande tabell för att analysera vilket nodtest som genererade vilka utdatarader, och därmed förstå vilka XML-data som blev vilken typ av nodtyp.

Indata Utdata Test av nodtyp
<?xml version="1.0"?> <?xml-version='1.0'?> XmlNodeType.XmlDeclaration
<-- Det här är ett XML-exempeldokument –> <--Det här är ett XML-exempeldokument –> XmlNodeType.Comment
<! DOCTYPE-objekt [<! ENTITETsnummer "123">]> <! DOCTYPE-objekt [<! ENTITETsnummer "123">] XmlNodeType.DocumentType
<Artiklar> <Artiklar> XmlNodeType.Element
<Artikel> <Artikel> XmlNodeType.Element
Testa med en entitet: &tal; Test med en entitet: 123 XmlNodeType.Text
</Objekt> </Objekt> XmlNodeType.EndElement
<Artikel> <Artikel> XmNodeType.Element
testa med ett underordnat element testa med ett underordnat element XmlNodeType.Text
<Mer> <Mer> XmlNodeType.Element
saker saker XmlNodeType.Text
</Objekt> </Objekt> XmlNodeType.EndElement
<Artikel> <Artikel> XmlNodeType.Element
testa med ett CDATA-avsnitt testa med ett CDATA-avsnitt XmlTest.Text
<! [CDATA[<456>]]> <! [CDATA[<456>]]> XmlTest.CDATA
def def XmlNodeType.Text
</Objekt> </Objekt> XmlNodeType.EndElement
<Artikel> <Artikel> XmlNodeType.Element
Testa med en teckenentitet: A Testa med en char-entitet: A XmlNodeType.Text
</Objekt> </Objekt> XmlNodeType.EndElement
<-- Fjorton tecken i det här elementet.--> <--Fjorton tecken i det här elementet.--> XmlNodeType.Comment
<Artikel> <Artikel> XmlNodeType.Element
1234567890ABCD 1234567890ABCD XmlNodeType.Text
</Objekt> </Objekt> XmlNodeType.EndElement
</Objekt> </Objekt> XmlNodeType.EndElement

Du måste veta vilken nodtyp som tilldelas, eftersom nodtypen styr vilka typer av åtgärder som är giltiga och vilken typ av egenskaper du kan ange och hämta.

Nodskapande för tomt utrymme styrs när data läses in i DOM av flaggan PreserveWhitespace . Mer information finns i Tomt utrymme och betydande hantering av tomt utrymme vid inläsning av DOM.

Information om hur du lägger till nya noder i DOM finns i Infoga noder i ett XML-dokument. Information om hur du tar bort noder från DOM finns i Ta bort noder, innehåll och värden från ett XML-dokument. Information om hur du ändrar innehållet i noder i DOM finns i Ändra noder, innehåll och värden i ett XML-dokument.

Se även