Megosztás a következőn keresztül:


Az objektumhierarchia megfeleltetése XML-adatokhoz

Ha egy XML-dokumentum memóriában van, a fogalmi ábrázolás egy fa. Programozáshoz objektumhierarchiával rendelkezik a fa csomópontjainak eléréséhez. Az alábbi példa bemutatja, hogyan lesz az XML-tartalom csomóponttá.

Amikor az XML beolvasásra kerül az XML-dokumentumobjektum-modellbe (DOM), a részek csomópontokká alakulnak, és ezek a csomópontok további metaadatokat őriznek meg önmagukról, például a csomóponttípusukat és az értékeiket. A csomóponttípus az objektuma, és ez határozza meg, hogy milyen műveleteket lehet végrehajtani, és milyen tulajdonságok állíthatók be vagy kérhetők le.

Ha a következő egyszerű XML-fájllal rendelkezik:

Bemenet

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

A bemenet a memóriában a következő csomópontfaként jelenik meg a hozzárendelt csomóponttípus-tulajdonsággal:

példa csomópontfa
Könyv- és címcsomópontfa-ábrázolás

Az book elem XmlElement objektummá válik, titlea következő elem pedig XmlElement objektummá, míg az elem tartalma XmlText objektummá válik. Az XmlElement metódusok és tulajdonságok megtekintésekor a metódusok és tulajdonságok eltérnek az XmlText objektumon elérhető metódusok és tulajdonságoktól. Ezért az XML-korrektúra csomóponttípusának ismerete létfontosságú, mivel a csomópont típusa határozza meg a végrehajtható műveleteket.

Az alábbi példa XML-adatokban olvas, és a csomópont típusától függően más szöveget ír ki. A következő XML-adatfájlt használja bemenetként, items.xml:

Bemenet

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

Az alábbi példakód beolvassa a items.xml fájlt, és megjeleníti az egyes csomóponttípusok adatait.

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  

A példa kimenete az adatok csomóponttípusokhoz való leképezését mutatja be.

Kimenet

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

Ha egyszerre egy sorban adja meg a bemenetet, és a kódból generált kimenetet használja, az alábbi táblázat segítségével elemezheti, hogy melyik csomópontteszt milyen kimeneti sorokat hozott létre, és így megértheti, hogy milyen XML-adatok váltak csomóponttípussá.

Bemenet Kimenet Csomóponttípus-teszt
<?xml version="1.0"?> <?xml version='1.0'?> XmlNodeType.XmlDeclaration
<-- Ez egy minta XML-dokumentum –> <--A minta XML-dokumentum –> XmlNodeType.Megjegyzés
<!DOCTYPE elemek [<!ENTITÁS "123" SZÁM>]> <! DOCTYPE-elemek [<! "123"> ENTITÁSSZÁM] XmlNodeType.DocumentType
<Elemek> <Elemek> XmlNodeType.Element
<Cikk> <Cikk> XmlNodeType.Element
Tesztelés egy entitással: &szám; Tesztelés entitással: 123 XmlNodeType.Text
</Cikk> </Cikk> XmlNodeType.EndElement
<Cikk> <Cikk> XmNodeType.Element
tesztelés gyermekelemekkel tesztelés gyermekelemekkel XmlNodeType.Text
<több> <több> XmlNodeType.Element
dolgok dolgok XmlNodeType.Text
</Cikk> </Cikk> XmlNodeType.EndElement
<Cikk> <Cikk> XmlNodeType.Element
tesztelés CDATA-szakaszsal tesztelés CDATA-szakaszsal XmlTest.Text
<! [CDATA[<456>]]> <! [CDATA[<456>]]> XmlTest.CDATA
Def Def XmlNodeType.Text
</Cikk> </Cikk> XmlNodeType.EndElement
<Cikk> <Cikk> XmlNodeType.Element
Tesztelés karakter entitással: A Teszt egy karakter entitással: A XmlNodeType.Text
</Cikk> </Cikk> XmlNodeType.EndElement
<-- 14 karakter ebben az elemben.--> <--Ez az elem tizennégy karaktert tartalmaz.--> XmlNodeType.Megjegyzés
<Cikk> <Cikk> XmlNodeType.Element
1234567890ABCD 1234567890ABCD XmlNodeType.Text
</Cikk> </Cikk> XmlNodeType.EndElement
</Elemek> </Elemek> XmlNodeType.EndElement

Tudnia kell, hogy milyen csomóponttípus van hozzárendelve, mivel a csomópont típusa határozza meg, hogy milyen típusú műveletek érvényesek, és milyen típusú tulajdonságokat állíthat be és kérdezhet le.

A szabad terület csomópontlétrehozásának vezérlése akkor történik, ha az adatokat a PreserveWhitespace jelölő tölti be a DOM-ba. További információt a DOM betöltésekor a Szabad terület és a Jelentős szabad terület kezelése című témakörben talál.

Ha új csomópontokat szeretne hozzáadni a DOM-hoz, olvassa el a Csomópontok beszúrása XML-dokumentumba című témakört. Csomópontok eltávolítása a DOM-ból: Csomópontok, tartalom és értékek eltávolítása XML-dokumentumból. Ha módosítani szeretné a csomópontok tartalmát a DOM-ban, olvassa el az XML-dokumentumok csomópontjainak, tartalmának és értékeinek módosítása című témakört.

Lásd még