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:
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.