Compartir a través de


Asignar la jerarquía de objetos a datos XML

Cuando un documento XML está en memoria, la representación conceptual es un árbol. Para la programación, tiene una jerarquía de objetos para acceder a los nodos del árbol. En el ejemplo siguiente se muestra cómo el contenido XML se convierte en nodos.

A medida que el XML se lee en el Modelo de objetos de documento XML (DOM), las partes se traducen en nodos y estos nodos conservan metadatos adicionales sobre sí mismos, como su tipo de nodo y sus valores. El tipo de nodo es su objeto y es lo que determina qué acciones se pueden realizar y qué propiedades se pueden establecer o recuperar.

Si tiene el siguiente código XML simple:

Entrada

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

La entrada se representa en memoria como el árbol de nodos siguiente con la propiedad de tipo de nodo asignado:

árbol de nodos de ejemplo
Representación de árbol de nodo de libro y título

El book elemento se convierte en un objeto XmlElement , el elemento siguiente, title, también se convierte en XmlElement, mientras que el contenido del elemento se convierte en un objeto XmlText . Al examinar los métodos y propiedades XmlElement , los métodos y propiedades son diferentes de los métodos y propiedades disponibles en un objeto XmlText . Por lo tanto, es fundamental saber en qué tipo de nodo se convierte el marcado XML, ya que su tipo de nodo determina las acciones que se pueden realizar.

En el ejemplo siguiente se leen datos XML y se escribe texto diferente según el tipo de nodo. Con el siguiente archivo de datos XML como entrada, items.xml:

Entrada

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

En el ejemplo de código siguiente se lee el archivo items.xml y se muestra información para cada tipo de nodo.

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 salida del ejemplo revela la asignación de los datos a los tipos de nodo.

Salida

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

Tomando la entrada una línea a la vez y usando la salida generada a partir del código, puede usar la tabla siguiente para analizar qué prueba de nodo generó qué líneas de salida, entendiendo así qué datos XML se convirtieron en qué tipo de nodo.

Entrada Salida Prueba de tipo de nodo
<?xml version="1.0"?> <?xml version='1.0'?> XmlNodeType.XmlDeclaration
<-- Se trata de un documento XML de ejemplo:> <--Este es un documento XML de ejemplo:> XmlNodeType.Comment
<! DOCTYPE Items [<! Número de ENTIDAD "123">]> <! DOCTYPE Items [<! Número de ENTIDAD "123">] XmlNodeType.DocumentType
<Elementos> <Elementos> XmlNodeType.Element
<Artículo> <Artículo> XmlNodeType.Element
Prueba con una entidad: &number; Prueba con una entidad: 123 XmlNodeType.Text
</Artículo> </Artículo> XmlNodeType.EndElement
<Artículo> <Artículo> XmNodeType.Element
prueba con un elemento secundario prueba con un elemento secundario XmlNodeType.Text
<más> <más> XmlNodeType.Element
embutir embutir XmlNodeType.Text
</Artículo> </Artículo> XmlNodeType.EndElement
<Artículo> <Artículo> XmlNodeType.Element
prueba con una sección CDATA prueba con una sección CDATA XmlTest.Text
<! [CDATA[<456>]]> <! [CDATA[<456>]]> XmlTest.CDATA
Def Def XmlNodeType.Text
</Artículo> </Artículo> XmlNodeType.EndElement
<Artículo> <Artículo> XmlNodeType.Element
Prueba con una entidad de carácter: A Prueba con una entidad de carácter: A XmlNodeType.Text
</Artículo> </Artículo> XmlNodeType.EndElement