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