LEITURA DE XML COM VB.NET

HORICH 25/06/2013 11:06:53
#425180
Bom caros colegas, estava procurando meios de ler um arquivo .XML então achei o site do macoratti tinha um meio que me ajudou porem o xml tem uma TAG assim:

<TAG xmlns = [Ô]http://www.site.com.br[Ô]>
<OUTRATAG>
<MAISUMATAG>Texto</MAISUMATAG>
</OUTRATAG>
</TAG>

Ai quando vou referenciar a tag que eu quero fazer a leitura

oNoLista = oXML.SelectNodes([Ô]/TAG/OUTRATAG[Ô])

Ele da pal, eu acho que é por causa do comando xmlns
por que quando eu edito o xml para tirar esse comando ele lê normalmente

se alguém puder me ajudar, agradeço por que tá osso rs
CLEVERTON 26/06/2013 09:22:01
#425220
Qual o Erro ?
HORICH 26/06/2013 13:13:18
#425249
Ele não lê, para de uma forma como se não pudesse achar a tag...
Ai se eu tiro o xmlns ele lê normal =s
KERPLUNK 26/06/2013 13:40:11
#425252
Já tentou usar serialização? Não veja XML como um arquivo texto qualquer, ele é um arquivo de dados, mais ou menos como um MDB e o melhor jeito de lê-lo, é usando serialização
OCELOT 26/06/2013 15:09:49
#425262
Resposta escolhida
Quando um documento tem um namespace do xml ele passa a ser um elemento diferente, só que o SelectNodes vai considerar qualquer elemento sem um prefixo como tendo namespace vazio, por isso ele não retorna nada.

O único jeito de corrigir isso é adicionando um prefixo para este namespace, se o namespace é sempre o mesmo é bem simples fazer isso, se ele for diferente para cada XML pode ser meio complicado.

Assumindo que você está usando o XmlDocument e que sua variável se chame oXML ficaria mais ou menos assim
Dim nm as New XmlNamespaceManager(oXML.NameTable)
nm.AddNamespace([Ô]ab[Ô],[Ô]http://www.site.com.br[Ô])

oNoLista = oXML.SelectNodes([Ô]/ab:TAG/ab:OUTRATAG[Ô], nm)


No caso ali o [Ô]ab[Ô] pode ser o nome que você quiser, você vai ter que usar o mesmo que colocar ali para identificar os elementos no XPath
HORICH 26/06/2013 16:09:09
#425265
Citação:

:
Já tentou usar serialização? Não veja XML como um arquivo texto qualquer, ele é um arquivo de dados, mais ou menos como um MDB e o melhor jeito de lê-lo, é usando serialização



Desculpa mais não conheço serialização poderia me dar uma ideia como funciona ?


Citação:

:
Quando um documento tem um namespace do xml ele passa a ser um elemento diferente, só que o SelectNodes vai considerar qualquer elemento sem um prefixo como tendo namespace vazio, por isso ele não retorna nada.

O único jeito de corrigir isso é adicionando um prefixo para este namespace, se o namespace é sempre o mesmo é bem simples fazer isso, se ele for diferente para cada XML pode ser meio complicado.

Assumindo que você está usando o XmlDocument e que sua variável se chame oXML ficaria mais ou menos assim

Dim nm as New XmlNamespaceManager(oXML.NameTable)
nm.AddNamespace([Ô]ab[Ô],[Ô]http://www.site.com.br[Ô])

oNoLista = oXML.SelectNodes([Ô]/ab:TAG/ab:OUTRATAG[Ô], nm)


No caso ali o [Ô]ab[Ô] pode ser o nome que você quiser, você vai ter que usar o mesmo que colocar ali para identificar os elementos no XPath




Cara Pelo o que eu entendi eu trocaria o endereço por qualquer outra coisa certo ?
Só que o problema que eu identifiquei foi que o xmlns trava a leitura do arquivo não sei por que
KERPLUNK 26/06/2013 16:56:04
#425270
Citação:

Desculpa mais não conheço serialização poderia me dar uma ideia como funciona ?



Várias opções...
OCELOT 26/06/2013 17:58:54
#425272
Não, o endereço deve ser o mesmo que vem no xml

O que acontece é que quando existe um xmlns (namespace xml) é necessário um prefixo para o nome da tag ou o SelectNodes não consegue encontrar ela, e o prefixo é usado na forma de prefixo:nomeDaTag

Nas 3 linhas do meu exemplo o que eu faço é criar um objeto do tipo NamespaceManager
Adicionar um prefixo para o xmlns que veio no xml, sendo que no caso eu já sei que o xmlns é [Ô]http://www.site.com.br[Ô], então eu adiciono um prefixo para ele chamado [Ô]ab[Ô], este [Ô]ab[Ô] pode ser qualquer nome que eu quiser, porém ele é importante para o próximo passo
Por ultimo na hora de chamar o SelectNode eu mudo o XPath de [Ô]/TAG/OUTRATAG[Ô] para incluir o prefixo, ficando [Ô]/ab:TAG/ab:OUTRATAG[Ô], sendo que o prefixo aqui tem que ser o mesmo que foi definido no NamespaceManager
HORICH 27/06/2013 08:16:38
#425286
Citação:

:
Não, o endereço deve ser o mesmo que vem no xml

O que acontece é que quando existe um xmlns (namespace xml) é necessário um prefixo para o nome da tag ou o SelectNodes não consegue encontrar ela, e o prefixo é usado na forma de prefixo:nomeDaTag

Nas 3 linhas do meu exemplo o que eu faço é criar um objeto do tipo NamespaceManager
Adicionar um prefixo para o xmlns que veio no xml, sendo que no caso eu já sei que o xmlns é [Ô]http://www.site.com.br[Ô], então eu adiciono um prefixo para ele chamado [Ô]ab[Ô], este [Ô]ab[Ô] pode ser qualquer nome que eu quiser, porém ele é importante para o próximo passo
Por ultimo na hora de chamar o SelectNode eu mudo o XPath de [Ô]/TAG/OUTRATAG[Ô] para incluir o prefixo, ficando [Ô]/ab:TAG/ab:OUTRATAG[Ô], sendo que o prefixo aqui tem que ser o mesmo que foi definido no NamespaceManager




Entendi, Obrigado xD
Tópico encerrado , respostas não são mais permitidas