Partager via


Mappage de la hiérarchie d'objets à des données XML

Quand un document XML est en mémoire, sa représentation conceptuelle est une arborescence. Pour la programmation, vous disposez d'une hiérarchie d'objets pour accéder aux nœuds de l'arborescence. L'exemple suivant illustre la manière dont le contenu XML se transforme en nœuds.

Lorsque le contenu XML est lu dans le DOM (Document Object Model) XML, ses fragments sont convertis en nœuds, et ces nœuds conservent des métadonnées supplémentaires à leur propre sujet, telles que leur type de nœud et leurs valeurs. Le type de nœud est son objet et est l'élément qui détermine les actions pouvant être réalisées ainsi que les propriétés pouvant être définies ou extraites.

Supposons l'exemple de code XML simple suivant :

Entrée

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

L'entrée est représentée dans la mémoire sous la forme de l'arborescence de nœuds suivante, avec la propriété de type de nœud assignée :

Représentation sous forme d'arborescence de nœuds book et title

Exemple d'arborescence de nœuds

L'élément book devient un objet XmlElement, tout comme l'élément suivant, title, alors que le contenu de l'élément devient un objet XmlText. Si vous examinez les méthodes et propriétés de XmlElement, vous constaterez qu'elles sont différentes des méthodes et propriétés disponibles pour un objet XmlText. Il est donc vital de connaître le type de nœud dans lequel le balisage XML se transforme, puisque ce type de nœud détermine les actions possibles.

L'exemple suivant lit dans les données XML et écrit le texte différent, en fonction du type de nœud. En utilisant comme entrée le fichier de données XML items.xml :

Entrée

<?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: &#65;</Item>
  <!-- Fourteen chars in this element.-->
  <Item>1234567890ABCD</Item>
</Items>

L'exemple de code suivant lit le fichier items.xml et affiche des informations pour chaque type de nœud.

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

La sortie de cet exemple révèle le mappage des données aux types de nœud.

Sortie

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

En prenant l'entrée une ligne à la fois et en utilisant la sortie générée par le code, vous pouvez vous servir du tableau suivant pour analyser quel nœud test a généré quelles lignes de sortie, ce qui vous aidera à déterminer plus clairement quelles données XML se sont transformées en quelle catégorie de types de nœud.

Entrée

Sortie

Type de nœud test

<?xml version="1.0"?>

<?xml version='1.0'?>

XmlNodeType.XmlDeclaration

<!-- This is a sample XML document -->

<!-- This is a sample XML document -->

XmlNodeType.Comment

<!DOCTYPE Items [<!ENTITY number "123">]>

<!DOCTYPE Items [<!ENTITY number "123">]

XmlNodeType.DocumentType

<Items>

<Items>

XmlNodeType.Element

<Item>

<Item>

XmlNodeType.Element

Test with an entity: &number;</Item>

Test with an entity: 123

XmlNodeType.Text

</Item>

</Item>

XmlNodeType.EndElement

<Item>

<Item>

XmNodeType.Element

test with a child element

test with a child element

XmlNodeType.Text

<more>

<more>

XmlNodeType.Element

stuff

stuff

XmlNodeType.Text

</Item>

</Item>

XmlNodeType.EndElement

<Item>

<Item>

XmlNodeType.Element

test with a CDATA section

test with a CDATA section

XmlTest.Text

<![CDATA[<456>]]>

<![CDATA[<456>]]>

XmlTest.CDATA

def

def

XmlNodeType.Text

</Item>

</Item>

XmlNodeType.EndElement

<Item>

<Item>

XmlNodeType.Element

Test with a char entity: &#65;

Test with a char entity: A

XmlNodeType.Text

</Item>

</Item>

XmlNodeType.EndElement

<!-- Fourteen chars in this element.-->

<--Fourteen chars in this element.-->

XmlNodeType.Comment

<Item>

<Item>

XmlNodeType.Element

1234567890ABCD

1234567890ABCD

XmlNodeType.Text

</Item>

</Item>

XmlNodeType.EndElement

</Items>

</Items>

XmlNodeType.EndElement

Il est essentiel de savoir quel type de nœud est assigné, puisque le type de nœud régit les actions valides et les types de propriétés qu'il est possible de définir et d'extraire.

La création de nœuds pour l'espace blanc est contrôlée au moment du chargement des données dans le DOM par l'indicateur PreserveWhitespace. Pour plus d'informations, voir Gestion des espaces blancs significatifs ou non lors du chargement du DOM.

Pour ajouter de nouveaux nœuds au DOM, voir Insertion de nœuds dans un document XML. Pour supprimer des nœuds du DOM, voir Suppression de nœuds, de contenu et de valeurs d'un document XML. Pour modifier le contenu de nœuds dans le DOM, voir Modification de nœuds, de contenu et de valeurs dans un document XML.

Voir aussi

Concepts

DOM (Document Object Model) XML