De objecthiërarchie toewijzen aan XML-gegevens
Wanneer een XML-document zich in het geheugen bevindt, is de conceptuele weergave een structuur. Voor programmeren hebt u een objecthiërarchie voor toegang tot de knooppunten van de structuur. In het volgende voorbeeld ziet u hoe de XML-inhoud knooppunten wordt.
Terwijl de XML wordt ingelezen in het XML Document Object Model (DOM), worden de stukken omgezet in knooppunten en behouden deze knooppunten aanvullende metagegevens over zichzelf, zoals het knooppunttype en de waarden. Het knooppunttype is het object en bepaalt welke acties kunnen worden uitgevoerd en welke eigenschappen kunnen worden ingesteld of opgehaald.
Als u de volgende eenvoudige XML hebt:
Invoer
<book>
<title>The Handmaid's Tale</title>
</book>
De invoer wordt in het geheugen weergegeven als de volgende knooppuntstructuur met de eigenschap toegewezen knooppunttype:
Structuurweergave boek- en titelknooppunt
Het book
element wordt een XmlElement-object , het volgende element, title
wordt ook een XmlElement, terwijl de elementinhoud een XmlText-object wordt. Bij het bekijken van de XmlElement-methoden en -eigenschappen zijn de methoden en eigenschappen anders dan de methoden en eigenschappen die beschikbaar zijn voor een XmlText-object . Dus weten welk knooppunttype de XML-markering wordt, is essentieel, omdat het knooppunttype bepaalt welke acties kunnen worden uitgevoerd.
In het volgende voorbeeld worden XML-gegevens gelezen en verschillende tekst weggeschreven, afhankelijk van het knooppunttype. Gebruik het volgende XML-gegevensbestand als invoer, items.xml:
Invoer
<?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>
In het volgende codevoorbeeld wordt het items.xml-bestand gelezen en wordt informatie weergegeven voor elk knooppunttype.
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
De uitvoer uit het voorbeeld toont de toewijzing van de gegevens aan de knooppunttypen.
Uitvoer
<?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>
Als u de invoer één regel tegelijk gebruikt en de uitvoer gebruikt die is gegenereerd op basis van de code, kunt u de volgende tabel gebruiken om te analyseren welke knooppunttest heeft gegenereerd welke regels uitvoer hebben gegenereerd, zodat u begrijpt welke XML-gegevens zijn geworden wat voor soort knooppunttype is geworden.
Invoer | Uitvoer | Knooppunttypetest |
---|---|---|
<?xml version="1.0"?> | <?xml version='1.0'?> | XmlNodeType.XmlDeclaration |
<-- Dit is een XML-voorbeelddocument -> | <--Dit is een XML-voorbeelddocument --> | XmlNodeType.Comment |
<! DOCTYPE-items [<! ENTITEITsnummer "123">]> | <! DOCTYPE-items [<! ENTITEITsnummer "123">] | XmlNodeType.DocumentType |
<Artikelen> | <Artikelen> | XmlNodeType.Element |
<Artikel> | <Artikel> | XmlNodeType.Element |
Testen met een entiteit: & | Testen met een entiteit: 123 | XmlNodeType.Text |
</Item> | </Item> | XmlNodeType.EndElement |
<Artikel> | <Artikel> | XmNodeType.Element |
testen met een onderliggend element | testen met een onderliggend element | XmlNodeType.Text |
<Meer> | <Meer> | XmlNodeType.Element |
stuff | stuff | XmlNodeType.Text |
</Item> | </Item> | XmlNodeType.EndElement |
<Artikel> | <Artikel> | XmlNodeType.Element |
testen met een CDATA-sectie | testen met een CDATA-sectie | XmlTest.Text |
<! [CDATA[<456>]]> | <! [CDATA[<456>]]> | XmlTest.CDATA |
def | def | XmlNodeType.Text |
</Item> | </Item> | XmlNodeType.EndElement |
<Artikel> | <Artikel> | XmlNodeType.Element |
Testen met een tekenentiteit: A | Testen met een tekenentiteit: A | XmlNodeType.Text |
</Item> | </Item> | XmlNodeType.EndElement |
<-- Veertien tekens in dit element.--> | <--Veertien tekens in dit element.--> | XmlNodeType.Comment |
<Artikel> | <Artikel> | XmlNodeType.Element |
1234567890ABCD | 1234567890ABCD | XmlNodeType.Text |
</Item> | </Item> | XmlNodeType.EndElement |
</Items> | </Items> | XmlNodeType.EndElement |
U moet weten welk knooppunttype is toegewezen, omdat het knooppunttype bepaalt welke soorten acties geldig zijn en welk type eigenschappen u kunt instellen en ophalen.
Het maken van knooppunten voor witruimte wordt bepaald wanneer de gegevens in de DOM worden geladen door de vlag PreserveWhitespace . Zie Witruimte en Significante witruimteafhandeling bij het laden van de DOM voor meer informatie.
Zie Knooppunten invoegen in een XML-document om nieuwe knooppunten toe te voegen aan de DOM. Als u knooppunten uit de DOM wilt verwijderen, raadpleegt u Knooppunten, inhoud en waarden verwijderen uit een XML-document. Zie Knooppunten, inhoud en waarden wijzigen in een XML-document om de inhoud van knooppunten in de DOM te wijzigen.