Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Fmelo1979

Ler XML em vários níveis com DOM

Recommended Posts

Olá, estou precisando ler um arquivo XML para posterior inserção no SQL.
O problema é que este XML tem vários níveis e não consigo ler a partir dos netos, não consigo por exemplo pegar os valores a partir do nó "contrato" e seus subníveis.

Vejam o arquivo XML:

======
<Lst_clientes>
<cliente>
<id>1</id>
<nome>JOÃO</nome>
<contrato>
<dados_contrato>
<valor>400</valor>
<qtde_vagas>2</qtde_vagas>
<list_dependentes>
<dependente>
<placa>GUP4421</placa>
<nome>Joana dos Santos</nome>
</dependente>
<dependente>
<placa>ANX8762</placa>
<nome>Aline Veiga</nome>
</dependente>
</list_dependentes>
</dados_contrato>
</contrato>
</cliente>
<Lst_clientes>
================

E abaixo o meu código, em vbscript (ASP clássico) :

================

Set MSXML = Server.CreateObject("MSXML2.DOMDocument.6.0")
MSXML.async = False
MSXML.load("C:\inetpub\wwwroot\Intranet\arquivo.xml")
Set raiz = MSXML.documentElement
For i = 0 To raiz.childNodes.length -1

response.write raiz.childNodes.item(i).childNodes.item(1).text
response.write raiz.childNodes.item(i).childNodes.item(2).text

Next
Set MSXML = Nothing

===========

Alguém poderia me ajudar?
Desde já agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

faz um for...next no childNodes

<%
' Cria uma instância do controle
Set MsXml = Server.CreateObject("MSXML2.DOMDocument.4.0")
' Indicamos que o download em segundo plano não é permitido
MsXml.async = False
' Carrega o documento XML
MsXml.load( Server.MapPath("arquivo.xml") )

' O método parseError contém informações sobre o último erro ocorrido
If MsXml.parseError <> 0 Then
  Response.Write "Código do erro: "& MsXml.parseError.ErrorCode &"<br />"
  Response.Write "Posição no arquivo: "& MsXml.parseError.FilePos &"<br />"
  Response.Write "Linha: "& MsXml.parseError.Line &"<br />"
  Response.Write "Posição na linha: "& MsXml.parseError.LinePos &"<br />"
  Response.Write "Descrição: "& MsXml.parseError.Reason &"<br />"
  Response.Write "Texto que causa o erro: "& MsXml.parseError.srcText &"<br />"
  Response.Write "Arquivo com problemas: " & MsXml.parseError.URL
Else
  ' A propriedade documentElement refere-se à raiz do documento
  Set raiz = MsXml.documentElement

  'Looping para percorrer todos os elementos filhos
  For i = 0 To raiz.childNodes.length -1
    ' A propriedade NodeName contém o nome do elemento e a propriedade childNodes contém a lista de elementos filhos
    Response.Write raiz.NodeName & "<br />"
    Response.Write raiz.childNodes.item(i).childNodes.item(0).text & "<br />"
    Response.Write raiz.childNodes.item(i).childNodes.item(1).text & "<br />"
  Next 
End If

' Tira o objeto da memória
Set MsXml = Nothing

%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá xanburzum!

 

Mas o problema é que desta forma só consigo pegar os filhos e preciso pegar os "netos", "bisnetos".

Seria fazendo LOOP dentro do LOOP?

Pode "printar" um exemplo fazendo favor?

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

olha este exemplo:

 

Set raiz = objXML.documentElement
'Response.write raiz.NodeName & "<br>" 'nome do node principal

'Looping para percorrer todos os elementos filhos
For i = 0 to raiz.childNodes.length -1

'########### FILHOS paymentMethod ##############################
if raiz.childNodes.item(i).nodename = "paymentMethod" then
set xmlRaiz = objXML.getElementsByTagName("paymentMethod")
for y = 0 to xmlRaiz.length - 1

str_paymentMethod_type = xmlRaiz.item(y).childNodes.item(0).text
str_paymentMethod_code = xmlRaiz.item(y).childNodes.item(1).text

response.write "<font color=red>"
response.write "Payment Method - " &xmlRaiz.item(y).childNodes.item(0).nodename &" : "& xmlRaiz.item(y).childNodes.item(0).text &"<br>" 'type
response.write "Payment Method - " &xmlRaiz.item(y).childNodes.item(1).nodename &" : "& xmlRaiz.item(y).childNodes.item(1).text &"<br>" 'code
response.write "</font>"
next
set xmlRaiz = nothing
'########### FILHOS #####################


'########### filho "item" (NETOS items) #########################
elseif raiz.childNodes.item(i).nodename = "items" then
set xmlRaiz2 = objXML.getElementsByTagName("item")
for z = 0 to xmlRaiz2.length - 1

str_items_item_id = xmlRaiz2.item(z).childNodes.item(0).text
str_items_item_description = xmlRaiz2.item(z).childNodes.item(1).text
str_items_item_count = xmlRaiz2.item(z).childNodes.item(2).text
str_items_item_amount = xmlRaiz2.item(z).childNodes.item(3).text

response.write "<font color=red>"
response.write xmlRaiz2.item(z).childNodes.item(0).nodename &" : "& xmlRaiz2.item(z).childNodes.item(0).text &"<br>" 'id
response.write xmlRaiz2.item(z).childNodes.item(1).nodename &" : "& xmlRaiz2.item(z).childNodes.item(1).text &"<br>" 'description
response.write xmlRaiz2.item(z).childNodes.item(2).nodename &" : "& xmlRaiz2.item(z).childNodes.item(2).text &"<br>" 'count
response.write xmlRaiz2.item(z).childNodes.item(3).nodename &" : "& xmlRaiz2.item(z).childNodes.item(3).text &"<br>" 'amount
response.write "</font>"
next
set xmlRaiz = nothing
'########### filho item (NETOS items) ########################

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fmelo1979 pode me mostrar como conseguiu resolver a leitura do seu xml? estou usando o mesmo exemplo e não estou conseguindo fazer funcionar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.