Share via


Mapování hierarchie objektů na data XML

Pokud je dokument XML v paměti, koncepční reprezentace je strom. Pro programování máte hierarchii objektů pro přístup k uzlům stromu. Následující příklad ukazuje, jak se obsah XML stane uzly.

Při čtení XML do modelu DOM (Document Object Model) XML se části překládají do uzlů a tyto uzly si zachovají další metadata o sobě, například jejich typ a hodnoty uzlu. Typ uzlu je jeho objekt a určuje, jaké akce lze provést a jaké vlastnosti lze nastavit nebo načíst.

Pokud máte následující jednoduchý kód XML:

Vstup

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

Vstup je reprezentován v paměti jako následující strom uzlu s přiřazeným typem uzlu vlastnost:

example node tree
Reprezentace stromového stromu knihy a názvu uzlu

Element book se stane XmlElement objekt, další element, title, také XmlElement, zatímco element obsah se stane XmlText objektu. Při pohledu na XmlElement metody a vlastnosti jsou metody a vlastnosti odlišné než metody a vlastnosti dostupné v XmlText objektu. Znalost typu uzlu, ze kterého se kód XML stane, je zásadní, protože jeho typ uzlu určuje akce, které lze provést.

Následující příklad čte data XML a zapisuje jiný text v závislosti na typu uzlu. Pomocí následujícího datového souboru XML jako vstupu items.xml:

Vstup

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

Následující příklad kódu přečte soubor items.xml a zobrazí informace pro každý typ uzlu.

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  

Výstup z příkladu ukazuje mapování dat na typy uzlů.

Výstup

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

Když vezmete vstupní jeden řádek najednou a použijete výstup vygenerovaný z kódu, můžete pomocí následující tabulky analyzovat, jaký test uzlu vygeneroval, které řádky výstupu, a tím pochopit, jaká data XML se stala typem uzlu.

Vstup Výstup Test typu uzlu
<?xml version="1.0"?> <?xml version='1.0'?> XmlNodeType.XmlDeclaration
<-- Toto je ukázkový dokument XML –> <--Ty je ukázkový dokument XML –> XmlNodeType.Comment
<! Položky DOCTYPE [<! ČÍSLO ENTITY "123">]> <! Položky DOCTYPE [<! ČÍSLO ENTITY "123">] XmlNodeType.DocumentType
<Položky> <Položky> XmlNodeType.Element
<Položka> <Položka> XmlNodeType.Element
Testování pomocí entity: &number; Testování s entitou: 123 XmlNodeType.Text
</Položky> </Položky> XmlNodeType.EndElement
<Položka> <Položka> XmNodeType.Element
test s podřízeným prvkem test s podřízeným prvkem XmlNodeType.Text
<další…> <další…> XmlNodeType.Element
věci věci XmlNodeType.Text
</Položky> </Položky> XmlNodeType.EndElement
<Položka> <Položka> XmlNodeType.Element
test s částí CDATA test s částí CDATA XmlTest.Text
<! [CDATA[<456>]]> <! [CDATA[<456>]]> XmlTest.CDATA
def def XmlNodeType.Text
</Položky> </Položky> XmlNodeType.EndElement
<Položka> <Položka> XmlNodeType.Element
Testování pomocí entity char: A Testování s entitou char: A XmlNodeType.Text
</Položky> </Položky> XmlNodeType.EndElement
<-- čtrnáct znaků v tomto prvku.--> <--Čtrnáct znaků v tomto prvku.--> XmlNodeType.Comment
<Položka> <Položka> XmlNodeType.Element
1234567890ABCD 1234567890ABCD XmlNodeType.Text
</Položky> </Položky> XmlNodeType.EndElement
</Položky> </Položky> XmlNodeType.EndElement

Musíte vědět, jaký typ uzlu je přiřazen, protože typ uzlu určuje, jaké druhy akcí jsou platné a jaké vlastnosti můžete nastavit a načíst.

Vytvoření uzlu pro prázdné znaky se řídí při načtení dat do DOM příznakem PreserveWhitespace . Další informace najdete v tématu Zpracování prázdných znaků a významných prázdných znaků při načítání dom.

Pokud chcete do doM přidat nové uzly, přečtěte si téma Vložení uzlů do dokumentu XML. Pokud chcete odebrat uzly z modelu DOM, přečtěte si téma Odebrání uzlů, obsahu a hodnot z dokumentu XML. Pokud chcete upravit obsah uzlů v modelu DOM, přečtěte si článek Úpravy uzlů, obsahu a hodnot v dokumentu XML.

Viz také