Partilhar via


Mapeando a hierarquia de objetos para dados XML

Quando um documento XML está na memória, a representação conceitual é uma árvore. Para programação, você tem uma hierarquia de objetos para acessar os nós da árvore. O exemplo a seguir mostra como o conteúdo XML se torna nós.

À medida que o XML é lido no DOM (Document Object Model) XML, as partes são convertidas em nós, e esses nós retêm metadados adicionais sobre si mesmos, como o tipo e os valores do nó. O tipo de nó é seu objeto e é o que determina quais ações podem ser executadas e quais propriedades podem ser definidas ou recuperadas.

Se você tiver o seguinte XML simples:

Entrada

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

A entrada é representada na memória como a seguinte árvore de nós com a propriedade de tipo de nó atribuída:

example node tree
Representação da árvore do nó do livro e do título

O book elemento se torna um objeto XmlElement, o próximo elemento, title, também se torna um XmlElement, enquanto o conteúdo do elemento se torna um objeto XmlText. Ao examinar os métodos e propriedades XmlElement , os métodos e propriedades são diferentes dos métodos e propriedades disponíveis em um objeto XmlText . Portanto, saber qual tipo de nó a marcação XML se torna é vital, pois seu tipo de nó determina as ações que podem ser executadas.

O exemplo a seguir lê dados XML e grava texto diferente, dependendo do tipo de nó. Usando o seguinte arquivo de dados 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>  

O exemplo de código a seguir lê o arquivo items.xml e exibe informações para cada tipo de nó.

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 saída do exemplo revela o mapeamento dos dados para os tipos de nó.

Saída

<?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 a entrada uma linha de cada vez e usando a saída gerada a partir do código, você pode usar a tabela a seguir para analisar qual teste de nó gerou quais linhas de saída, entendendo assim quais dados XML se tornaram que tipo de nó.

Entrada Saída Teste de tipo de nó
<?xml version="1.0"?> <?xml version='1.0'?> XmlNodeType.XmlDeclaration
<-- Este é um documento XML de exemplo --> <--Este é um exemplo de documento XML --> XmlNodeType.Comment
<! Itens DOCTYPE [<! Número da ENTIDADE "123">]> <! Itens DOCTYPE [<! Número da ENTIDADE "123">] XmlNodeType.DocumentType
<Rubricas> <Rubricas> XmlNodeType.Element
<Item> <Item> XmlNodeType.Element
Teste com uma entidade: &número; Teste com uma entidade: 123 XmlNodeType.Text
</Artigo> </Artigo> XmlNodeType.EndElement
<Item> <Item> XmNodeType.Element
Teste com um elemento filho Teste com um elemento filho XmlNodeType.Text
<Saber mais> <Saber mais> XmlNodeType.Element
coisas coisas XmlNodeType.Text
</Artigo> </Artigo> XmlNodeType.EndElement
<Item> <Item> XmlNodeType.Element
teste com uma seção CDATA teste com uma seção CDATA XmlTest.Text
<! [CDATA[<456>]]> <! [CDATA[<456>]]> XmlTest.CDATA
def def XmlNodeType.Text
</Artigo> </Artigo> XmlNodeType.EndElement
<Item> <Item> XmlNodeType.Element
Teste com uma entidade char: A Teste com uma entidade char: A XmlNodeType.Text
</Artigo> </Artigo> XmlNodeType.EndElement
<-- Catorze caracteres neste elemento.--> <--Catorze caracteres neste elemento.--> XmlNodeType.Comment
<Item> <Item> XmlNodeType.Element
1234567890ABCD 1234567890ABCD XmlNodeType.Text
</Artigo> </Artigo> XmlNodeType.EndElement
</Itens> </Itens> XmlNodeType.EndElement

Você deve saber qual tipo de nó é atribuído, pois o tipo de nó controla quais tipos de ações são válidas e que tipo de propriedades você pode definir e recuperar.

A criação de nós para espaço em branco é controlada quando os dados são carregados no DOM pelo sinalizador PreserveWhitespace . Para obter mais informações, consulte Espaço em branco e manipulação significativa de espaço em branco ao carregar o DOM.

Para adicionar novos nós ao DOM, consulte Inserindo nós em um documento XML. Para remover nós do DOM, consulte Removendo nós, conteúdo e valores de um documento XML. Para modificar o conteúdo de nós no DOM, consulte Modificando nós, conteúdo e valores em um documento XML.

Consulte também