You are on page 1of 14

VB.

Net - XML Processing


O Extensible Markup Language (XML) é uma linguagem de marcação, como HTML ou SGML.
Está disponível como um padrão aberto e recomendado pelo consórcio World Wide Web. O
namespace System. xml no .net Framework contém classes para processamento de documentos
XML. A seguir estão algumas das classes comumente usados no namespace System. xml.

S.N Classe Descrição


Representa um atributo. Valores válido e padrão para o atributo
1 XmlAttribute são definidos em um definição de tipo de documento (DTD) ou
esquema.
2 XmlCDataSection Representa uma seção CDATA.
Fornece métodos de manipulação que são usados por várias
3 XmlCharacterData
classes de texto.
4 XmlComment Representa o conteúdo de um comentário XML.
Codifica e decodifica nomes XML e fornece métodos para
converter entre tipos common language runtime e tipos de
5 XmlConvert idioma (XSD) de definição de esquema XML. Ao converter
tipos de dados, os valores retornados são localidade
independente.
6 XmlDeclaration Representa o nó de declaração XML <? xml versão =' 1,0'.... >.
Implementa um dicionário usado para otimizar a
7 XmlDictionary implementações de leitor/gravador do Windows Communication
Foundation (WCF) do XML.
Uma classe abstrata que o Windows Communication Foundation
8 XmlDictionaryReader (WCF) deriva de XmlReader para fazer a serialização e
desserialização.
Representa uma classe abstrata que Windows Communication
9 XmlDictionaryWriter Foundation (WCF) deriva de XmlWriter para fazer a
serialização e desserialização.
10 XmlDocument Representa um documento XML.
Representa um objeto leve que é útil para operações de inserção
11 XmlDocumentFragment
de árvore.
12 XmlDocumentType Representa a declaração de tipo de documento.
13 XmlElement Representa um elemento.
Representa uma declaração de entidade, tais como <!ENTITY...
14 XmlEntity
>.
15 XmlEntityReference Representa um nó de referência de entidade.
16 XmlException Retorna informações detalhadas sobre a última exceção.
17 XmlImplementation Define o contexto de um conjunto de objetos XmlDocument.
18 XmlLinkedNode Obtém o nó imediatamente anteriores ou posteriores a este nó.
19 XmlNode Representa um único nó no documento XML.
20 XmlNodeList Representa uma coleção ordenada de nós.
Representa um leitor que fornece rápido, não-cache frente único
21 XmlNodeReader
acesso a dados XML em um XmlNode.
Representa uma declaração de notação, tais como <!
22 XmlNotation
NOTATION... >.
Fornece todas as informações de contexto necessárias pelo
23 XmlParserContext
XmlReader para analisar um fragmento XML.
Representa uma instrução de processamento, que define para
24 XmlProcessingInstruction manter informações específicas do processador no texto do
documento XML.
25 XmlQualifiedName Representa um nome qualificado XML.
Representa um leitor que fornece rápido, noncached, Avançar-
26 XmlReader
only de acesso a dados XML.
Especifica um conjunto de recursos para oferecer suporte no
27 XmlReaderSettings
objeto XmlReader criado pelo método Create.
Resolve externos recursos XML nomeados por um identificador
28 XmlResolver
de recurso uniforme (URI).
Ajuda a proteger outra implementação de XmlResolver objeto
29 XmlSecureResolver XmlResolver e restringir os recursos que base XmlResolver tem
acesso a.
Representa o espaço em branco entre marcação em um nó de
conteúdo misto ou espaço em branco dentro de um XML: Space
30 XmlSignificantWhitespace
= 'preserve' escopo. Isto também é referido como significativo
espaço em branco.
31 XmlText Representa o conteúdo de texto de um elemento ou atributo.
Representa um leitor que fornece acesso rápido, não em cache,
32 XmlTextReader
Avançar-only para dados XML.
Representa um gravador que fornece uma maneira rápida, não
em cache, somente Avançar de gerar fluxos ou arquivos que
33 XmlTextWriter contêm dados XML que está de acordo com o W3C Extensible
Markup Language (XML) 1.0 e os Namespaces em
recomendações XML.
Resolve externos recursos XML nomeados por um identificador
34 XmlUrlResolver
de recurso uniforme (URI).
35 XmlWhitespace Representa o espaço em branco no conteúdo do elemento.
Representa um gravador que fornece um meio rápido, não em
36 XmlWriter cache, Avançar-only de gerar fluxos ou arquivos que contêm
dados XML.
Especifica um conjunto de recursos para oferecer suporte no
37 XmlWriterSettings
objeto criado pelo método XmlWriter.

XML Parser APIs


As duas APIs mais básicas e amplamente utilizadas para dados XML são as interfaces SAX e DOM.
 API simples para XML (SAX): aqui, você registrar retornos de chamada para eventos de
interesse e então deixe o analisador proceder por meio de documento. Isso é útil quando seus
documentos são grandes ou você tem limitações de memória, ele analisa o arquivo como ele
lê-lo do disco, e todo o arquivo nunca é armazenado na memória.
 Document Object Model (DOM) API : Esta é a World Wide Web Consortium
recomendação em que todo o arquivo é lido na memória e armazenado em uma forma
hierárquica (árvore-baseada) para representar todas as características de um documento
XML.
SAX Obviamente não é possível processar informação mais puderes DOM ao trabalhar com
arquivos grandes. Por outro lado, usar o DOM exclusivamente pode realmente matar seus recursos,
especialmente se usado em um monte de arquivos pequenos.
SAX é somente leitura, enquanto DOM permite alterações no arquivo XML. Desde que estas duas
APIs diferentes literalmente se complementam não há nenhuma razão porque você não pode usar os
dois para grandes projetos.
Para todos os nossos exemplos de código XML, vamos usar um simples arquivo movies.xml de
arquivo XML como uma entrada:
<?xml version="1.0"?>

<collection shelf="New Arrivals">


<movie title="Enemy Behind">
<type>War, Thriller</type>
<format>DVD</format>
<year>2003</year>
<rating>PG</rating>
<stars>10</stars>
<description>Talk about a US-Japan war</description>
</movie>
<movie title="Transformers">
<type>Anime, Science Fiction</type>
<format>DVD</format>
<year>1989</year>
<rating>R</rating>
<stars>8</stars>
<description>A schientific fiction</description>
</movie>
<movie title="Trigun">
<type>Anime, Action</type>
<format>DVD</format>
<episodes>4</episodes>
<rating>PG</rating>
<stars>10</stars>
<description>Vash the Stampede!</description>
</movie>
<movie title="Ishtar">
<type>Comedy</type>
<format>VHS</format>
<rating>PG</rating>
<stars>2</stars>
<description>Viewable boredom</description>
</movie>
</collection>

Análise de XML com SAX API

No modelo de SAX, você pode usar as classes XmlReader e XmlWriter para trabalhar com dados
XML. A classe XmlReader é usada para ler dados XML de forma rápida, Avançar-only e não-cache.
Ele lê um documento XML ou um fluxo.
Exemplo 1
Este exemplo demonstra a leitura de dados XML do movies.xml arquivo.
Siga os seguintes passos:
 Adicione o arquivo movies.xml na pasta bin\Debug do seu aplicativo.
 Importar o namespace System. xml no arquivo Form1. vb.
 Adicione um rótulo no formulário e altere seu texto para 'Filmes Galore'.
 Adicionar três caixas de listagem e três botões para mostrar o título, o tipo e a descrição de
um filme do arquivo xml.
 Adicione o seguinte código usando a janela do editor de código.
Imports System.Xml
Public Class Form1

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load


' Definir o texto da barra de legenda do formulário.
Me.Text = "tutorialspoint.com"
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles


Button1.Click
ListBox1().Items.Clear()
Dim xr As XmlReader = XmlReader.Create("movies.xml")
Do While xr.Read()
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "movie" Then
ListBox1.Items.Add(xr.GetAttribute(0))
End If
Loop
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles


Button2.Click
ListBox2().Items.Clear()
Dim xr As XmlReader = XmlReader.Create("movies.xml")
Do While xr.Read()
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "type" Then
ListBox2.Items.Add(xr.ReadElementString)
Else
xr.Read()
End If
Loop
End Sub

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles


Button3.Click
ListBox3().Items.Clear()
Dim xr As XmlReader = XmlReader.Create("movies.xml")
Do While xr.Read()
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "description"
Then
ListBox3.Items.Add(xr.ReadElementString)
Else
xr.Read()
End If
Loop
End Sub
End Class

Executar e executar o código acima usando o botão de arranque disponível na barra de ferramentas
do Microsoft Visual Studio. Clicando nos botões exibiria, título, tipo e descrição dos filmes do
arquivo..

A classe XmlWriter é usada para gravar dados XML em um fluxo, um arquivo ou um objeto
TextWriter. Ele também funciona em uma maneira de Somente-Avançar, não em cache.

Exemplo 2
Vamos crie um arquivo XML, adicionando alguns dados em tempo de execução. Siga os seguintes
passos:
 Adicione um controle WebBrowser e um controle button no formulário.
 Altere a propriedade texto do botão para mostrar arquivo de autores.
 Adicione o seguinte código no editor de código.
Imports System.Xml
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' Definir o texto da barra de legenda do formulário.
Me.Text = "tutorialspoint.com"
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles


Button1.Click
Dim xws As XmlWriterSettings = New XmlWriterSettings()
xws.Indent = True
xws.NewLineOnAttributes = True
Dim xw As XmlWriter = XmlWriter.Create("authors.xml", xws)
xw.WriteStartDocument()
xw.WriteStartElement("Authors")
xw.WriteStartElement("author")
xw.WriteAttributeString("code", "1")
xw.WriteElementString("fname", "Zara")
xw.WriteElementString("lname", "Ali")
xw.WriteEndElement()
xw.WriteStartElement("author")
xw.WriteAttributeString("code", "2")
xw.WriteElementString("fname", "Priya")
xw.WriteElementString("lname", "Sharma")
xw.WriteEndElement()
xw.WriteStartElement("author")
xw.WriteAttributeString("code", "3")
xw.WriteElementString("fname", "Anshuman")
xw.WriteElementString("lname", "Mohan")
xw.WriteEndElement()
xw.WriteStartElement("author")
xw.WriteAttributeString("code", "4")
xw.WriteElementString("fname", "Bibhuti")
xw.WriteElementString("lname", "Banerjee")
xw.WriteEndElement()
xw.WriteStartElement("author")
xw.WriteAttributeString("code", "5")
xw.WriteElementString("fname", "Riyan")
xw.WriteElementString("lname", "Sengupta")
xw.WriteEndElement()
xw.WriteEndElement()
xw.WriteEndDocument()
xw.Flush()
xw.Close()
WebBrowser1.Url = New Uri(AppDomain.CurrentDomain.BaseDirectory +
"authors.xml")
End Sub
End Class

Executar e executar o código acima usando o botão de arranque disponível na barra de ferramentas
do Microsoft Visual Studio. Clicando no arquivo autor mostrar exibiria o arquivo recém-criado
Authors XML no navegador da web.
Análise de XML com DOM API
De acordo com o documento Object Model (DOM), um documento XML é composto por nós e
atributos de nós. A classe XmlDocument é usada para implementar o analisador de XML DOM
do .net Framework. Ele também permite que você modificar um documento XML existente ao
inserir, excluir ou atualizar dados no documento.
A seguir estão alguns dos métodos comumente utilizados da classe XmlDocument:

S.N Nome do método & descrição


Adiciona o nó especificado ao final da lista de
AppendChild
1 nós filho, deste nó.

Cria um XmlAttribute com o nome


CreateAttribute(String)
2 especificado.

Cria um XmlComment contendo os dados


CreateComment
3 especificados.

Cria um atributo padrão com o prefixo


CreateDefaultAttribute
4 especificado, nome local e namespace URI.

CreateElement(String) Cria um elemento com o nome especificado.


5

Cria um XmlNode com o tipo de nó


CreateNode(String, String, String)
6 especificado, nome e NamespaceURI.

Cria um XmlNode com o especificado


CreateNode(XmlNodeType, String, String)
7 XmlNodeType, nome e NamespaceURI.

Cria um XmlNode com o especificado


CreateNode(XmlNodeType, String, String,
XmlNodeType, prefixo, nome e
8 String)
NamespaceURI.

Cria um XmlProcessingInstruction com o


CreateProcessingInstruction
9 nome especificado e dados.

CreateSignificantWhitespace Cria um nó XmlSignificantWhitespace.


10

CreateTextNode Cria um XmlText com o texto especificado.


11

CreateWhitespace Cria um nó XmlWhitespace.


12

Cria um nó XmlDeclaration com os valores


CreateXmlDeclaration
13 especificados.

14 GetElementById Obtém o XmlElement com o ID especificado.


Retorna um XmlNodeList contendo uma lista
GetElementsByTagName(String) de todos os elementos descendentes que
15
corresponde ao nome especificado.

Retorna um XmlNodeList contendo uma lista


de todos os elementos descendentes que
GetElementsByTagName(String, String)
16 coincidem com o especificado LocalName e
NamespaceURI.

Insere o nó especificado imediatamente após o


InsertAfter
17 nó de referência especificada.

Insere o nó especificado imediatamente antes o


InsertBefore
18 nó de referência especificada.

Carrega o documento XML do fluxo


Load(Stream)
19 especificado.

Carrega o documento XML da URL


Load(String)
20 especificada.

Carrega o documento XML do especificado


Load(TextReader)
21 TextReader.

Carrega o documento XML do especificado


Load(XmlReader)
22 XmlReader.

Carrega o documento XML do especificado


LoadXml
23 string.

Adiciona o nó especificado ao início da lista de


PrependChild
24 nós filhos para esse nó.

Cria um objeto XmlNode com base nas


ReadNode informações no XmlReader. O leitor deve ser
25
posicionado em um nó ou atributo.

Remove todos os nós filho e/ou atributos do nó


RemoveAll
26 atual.

RemoveChild Remove especificado nó filho.


27

Substitui o nó filho oldChild com newChild


ReplaceChild
28 nó.

29 Save(Stream) Salva o documento XML para o fluxo


especificado.

Salva o documento XML para o arquivo


Save(String)
30 especificado.

Salva o documento XML para o especificado


Save(TextWriter)
31 TextWriter..

Salva o documento XML para o especificado


Save(XmlWriter)
32 XmlWriter..

Exemplo 3
Neste exemplo, vamos inserir alguns novos nós no documento xml Authors. xml e em seguida,
mostrar todos os nomes dos autores primeiro em uma caixa de listagem.
Siga os seguintes passos:
 Adicionar o arquivo Authors XML na pasta bin/Debug do seu aplicativo (deve estar lá se
você já tentou o último exemplo)Import the System.Xml namespace
 Adicione uma caixa de listagem e um controle button no formulário e defina a propriedade
de texto do Controle button para mostrar os autores.
 Adicione o seguinte código usando o editor de código.
Imports System.Xml
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' Definir o texto da barra de legenda do formulário.
Me.Text = "tutorialspoint.com"
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles
Button1.Click
ListBox1.Items.Clear()
Dim xd As XmlDocument = New XmlDocument()
xd.Load("authors.xml")
Dim newAuthor As XmlElement = xd.CreateElement("author")
newAuthor.SetAttribute("code", "6")
Dim fn As XmlElement = xd.CreateElement("fname")
fn.InnerText = "Bikram"
newAuthor.AppendChild(fn)
Dim ln As XmlElement = xd.CreateElement("lname")
ln.InnerText = "Seth"
newAuthor.AppendChild(ln)
xd.DocumentElement.AppendChild(newAuthor)
Dim tr As XmlTextWriter = New XmlTextWriter("movies.xml", Nothing)
tr.Formatting = Formatting.Indented
xd.WriteContentTo(tr)
tr.Close()
Dim nl As XmlNodeList = xd.GetElementsByTagName("fname")
For Each node As XmlNode In nl
ListBox1.Items.Add(node.InnerText)
Next node
End Sub
End Class
Executar e executar o código acima usando o botão de arranque disponível na barra de ferramentas
do Microsoft Visual Studio. Clicar no botão Mostrar autor exibiria os primeiros nomes de todos os
autores, incluindo o que adicionamos em tempo de execução.

Importar XML NFe para sistema exemplo 1

Cara, eu faço a importação dos xmls das NFes tanto de clientes, fornecedores ou nossas próprias,
para o meu controle interno.
Antes eu usava uma função bem rudimentar, que lia item a item e dava muita dor de cabeça, ainda
mais quando os xmls diferiam de padrão (atualmente está bem raro, mas as vezes aparece ainda um
xml que não contenha algum tipo de tag que deveria existir...como isso acontece eu não sei, pq vem
dos fornecedores ou clientes as nfs).
Depois de apanhar muito eu finalmente entendi como usar um dataset para ler a nfe, aí ficou bem
mais fácil.
Eu faço assim:
Dim xmlDoc As New XmlDocument

xmlDoc.Load(sXML)

Dim Ds As New DataSet


Ds.ReadXml(sXML)

Dim bdsAux As New BindingSource


bdsAux.DataSource = Ds
bdsAux.DataMember = "infNFe" 'aqui é o pulo do gato!
'Nessa linha acima é que vc literalmente navega pelos diferentes "tag groups" da
nfe.
'Nesse em questão, eu selecionei a tag principal (ou uma das principais) infNFe.
'Para acessar uma informação filho direto dessa tag faça:

bdsAux.Current("Id").ToString
'Aqui eu to buscando o ID da nfe!

'E para mudar de tag, mesmo sendo filho ou não da tag pai, faça:

bdsAux.DataMember = "ide"

É muito mais fácil do que usar o outro método (na minha opnião é claro) em que vc tem que usar o
navigator etc...
Qualquer dúvida, só perguntar!
Att.
Giovani
******** OBS: no exemplo de código, nem precisa das duas primeiras linhas. Eu fui extraindo
partes de códigos do meu sistema e acabei colando código antigo em desuso. A variável sXML é o
caminho do arquivo ok?
or favor não se esqueça de fazer as mudanças de "tag" no dataset dentro de um bloco try catch.
Isso vale também para quando vc for tentar acessar um membro da tag. Se caso a tag ou membro da
tag não existir, o seus sistema não cai!!! rsrsrs Digo isso pq várias vezes esqueci disso...e de repente
o sistema caia...
Lógico que se começar a faltar muita tag, possivelmente o xml está com defeito. Mas ultimamente
isso é raro. No começo das nfe's que era terrível!

Importar XML NFe para sistema exemplo 2

Lendo XML com VB.NET


Nesta coluna estarei mostrando passo a passo como ler um arquivo XML via VB.NET.

Supondo que tenhamos um arquivo Xml com a estrutura abaixo:

Para ler o arquivo Xml em questão usaremos o classe “XmlDocument” da framework 2.0 que
estamos usando no momento. Vamos pegar somente o Nome, Especialidade e Crm do Médico em
questão, faremos então o procedimento a baixo:
Private Sub LeXml()

'*** Declara Variavel que lerá o documento XML

Dim objXml As New XmlDocument

'*** Declara Variavel indicara o caminho da XML no servidor web

Dim CaminhoXml As String = "C:WebSitesLeituraDeXmlXmlMedicos.xml"


'*** Adiciono no Metodo 'LoadXml' do objeto 'objXml' o caminho do
arquivo no servidor

objXml.Load(CaminhoXml)

'*** Lê os Nohs específicos de dentro do Noh Pai 'Medicos' os Nohs


Filhos

Dim MedicoNome As String =


objXml.SelectSingleNode("Medicos").ChildNodes(0).InnerText

Dim MedicoEspec As String =


objXml.SelectSingleNode("Medicos").ChildNodes(1).InnerText

Dim MedicoCrm As String =


objXml.SelectSingleNode("Medicos").ChildNodes(2).InnerText

'*** Exibe Dados do Medico de maneira simples na Pagina

Response.Write("> " & MedicoNome & "


")

Response.Write("> " & MedicoEspec & "


")

Response.Write("> " & MedicoCrm & "


")

End Sub

O Resultado de nosso procedimento será como este logo abaixo:

Explicando um pocuo como pegar os Nohs filhos de uma Tag especifica

Como no exemplo mostrado acima, quando eu executo a linha:


objXml.SelectSingleNode("Medicos").ChildNodes(0).InnerText

Estou falando para Selecionar a Tag 'Medicos' que é a Tag pai, atraves do método
'SelectSingleNode' que é do objeto 'objXml', onde eu posteriormete pego o primeiro Noh filho de
Tag Pai ou seja a Tag chamada 'Nome', faço isso quando digito:
.ChildNodes(0).InnerText

Reparem que esta escrito 'ChildNodes(0)' isso se refere ao primeiro XPath ou seja o primeiro Noh
da Tag Pai 'Medicos' visto que eu tenho mais de um Noh dentro dela. Fiz uma imagem de como
seria o XPath da estrutura de caminhos para ler a XML em questão:
Vendo os números poderemos ter uma ideia de como teremos que ler os outros Nohs que estão no
arquivo Xml. Faremos então o precedimento completo, como mostrado a abaixo:
Private Sub LeXml()

'*** Declara Variavel que lerá o documento XML

Dim objXml As New XmlDocument

'*** Declara Variavel indicara o caminho da XML no servidor web

Dim CaminhoXml As String = "C:WebSitesLeituraDeXmlXmlMedicos.xml"

'*** Adiciono no Metodo 'LoadXml' do objeto 'objXml' o caminho do


arquivo no servidor

objXml.Load(CaminhoXml)

'*** Lê os Nohs específicos de dentro do Noh Pai 'Medicos' os Nohs


Filhos

Dim MedicoNome As String =


objXml.SelectSingleNode("Medicos").ChildNodes(0).InnerText

Dim MedicoEspec As String =


objXml.SelectSingleNode("Medicos").ChildNodes(1).InnerText

Dim MedicoCrm As String =


objXml.SelectSingleNode("Medicos").ChildNodes(2).InnerText

'*** Lê os SubNohs dentro da SubNoh 'Consultorio'

Dim Logradouro As String =


objXml.SelectSingleNode("Medicos").ChildNodes(3).ChildNodes(0).InnerText

Dim TipoLogradouro As String =


objXml.SelectSingleNode("Medicos").ChildNodes(3).ChildNodes(1).InnerText

Dim Numero As String =


objXml.SelectSingleNode("Medicos").ChildNodes(3).ChildNodes(2).InnerText

Dim Bairro As String =


objXml.SelectSingleNode("Medicos").ChildNodes(3).ChildNodes(3).InnerText

Dim Municipio As String =


objXml.SelectSingleNode("Medicos").ChildNodes(3).ChildNodes(4).InnerText

Dim UF As String =
objXml.SelectSingleNode("Medicos").ChildNodes(3).ChildNodes(5).InnerText

Dim Cnes As String =


objXml.SelectSingleNode("Medicos").ChildNodes(3).ChildNodes(6).InnerText

'*** Exibe Dados do Medico de maneira simples na Pagina

Response.Write("> " & objXml.SelectSingleNode("Medicos").Name & "


")
Response.Write("> " & MedicoNome & "
")

Response.Write("> " & MedicoEspec & "


")

Response.Write("> " & MedicoCrm & "


")

'*** Exibe Dados do Consultorio do Médico

Response.Write("> " &


objXml.SelectSingleNode("Medicos").ChildNodes(3).Name & "
")

Response.Write("> " & Logradouro & "


")

Response.Write("> " & TipoLogradouro & "


")

Response.Write("> " & Numero & "


")

Response.Write("> " & Bairro & "


")

Response.Write("> " & Municipio & "


")

Response.Write("> " & UF & "


")

Response.Write("> " & Cnes & "


")

End Sub

Teremos então o seguinte resultado na pagina:

Espero que tenham gostado, pois é muito util no dia-a-dia para quem trabalha com desenvolvimento
e tentei exemplificar de uma forma bem simples mesmo, é claro que podemos montar uma classe
'objeto' para podemos ler uma xml e resgatar seus valores etc, mas o intuito aqui foi mostrar apenas
como se chega a um determinado Noh de uma XML.

You might also like