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:
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.