Ir para conteúdo

Arquivado

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

eulervicente

XPATH e OPENXML

Recommended Posts

Colegas, bom dia!

Estou precisando converter um XML em dado tabular (um registro de dados para cada conjunto de informações contidas no nó "Resultado"), mas estou tendo dificuldade em aprender a usar corretamente o XPATH para retornar os dados que eu quero.

Meu código abaixo não retorna valor nenhum. Alguém poderia me ajudar nisso? Como ficaria o XPATH e o mapeamento dos campos no OPENXML de forma correta?

DECLARE @idoc int, @doc varchar(8000);

SET @doc ='
<?xml version="1.0" encoding="utf-8"?>
<DataSet>
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<Consulta>
<Resultado diffgr:id="Resultado1" msdata:rowOrder="0" xmlns="Resultado">
<ID>2</ID>
<Edicao>2500</Edicao>
<DataPublicacao>2014-10-06T00:00:00-03:00</DataPublicacao>
<NumeroAto>2121</NumeroAto>
</Resultado>
<Resultado diffgr:id="Resultado2" msdata:rowOrder="0" xmlns="Resultado">
<ID>3</ID>
<Edicao>4500</Edicao>
<DataPublicacao>2014-10-07T00:00:00-03:00</DataPublicacao>
<NumeroAto>4560</NumeroAto>
</Resultado>
</Consulta>
</diffgr:diffgram>
</DataSet>
';

EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;
SELECT *
FROM OPENXML (@idoc, '//Consulta/Resultado') -- XPATH
WITH (ID smallint,
Edicao int,
DataPublicacao smalldatetime,
NumeroAto int);

 

Obrigado pela atenção!

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite!

 

Cara, primeiramente, XML é meu ponto fraco, principalmente com "diffgram", esse xml é gerado por alguma aplicação? se sim, existe a possibilidade de gerá-lo sem o diffgram? caso você os retire, pelo menos, das tags "Resultado" e passe o flag 2 na chamada do open xml, seu script trará os resultados.

 

-----------------------------------------------------------------------------------------------

 

DECLARE @idoc int, @doc varchar(8000);
SET @doc ='
<?xml version="1.0" encoding="utf-8"?>
<DataSet>
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<Consulta>
<Resultado>
<ID>2</ID>
<Edicao>2500</Edicao>
<DataPublicacao>2014-10-06T00:00:00-03:00</DataPublicacao>
<NumeroAto>2121</NumeroAto>
</Resultado>
<Resultado>
<ID>3</ID>
<Edicao>4500</Edicao>
<DataPublicacao>2014-10-07T00:00:00-03:00</DataPublicacao>
<NumeroAto>4560</NumeroAto>
</Resultado>
</Consulta>
</diffgr:diffgram>
</DataSet>
';
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;
SELECT *
FROM OPENXML (@idoc, '//Consulta/Resultado',2) -- XPATH
WITH (ID smallint,
Edicao int,
DataPublicacao smalldatetime,
NumeroAto int);
---------------------------------------------------------------------------------------------------------------------------------------
ID Edicao DataPublicacao NumeroAto
2 2500 2014-10-06 03:00:00 2121
3 4500 2014-10-07 03:00:00 4560

 

Estudarei mais sobre xml, espero ter ajudado com pelo menos um ponto de partida para a resolução do problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Diemerson!

 

Colega, esse XML é o resultado da chamada a um método de um Web Services que eu precisarei consumir. Parece que eles retornam do método um objeto DataSet (acho que a aplicação que gerou o WS é feita em .NET), por isso essa infinidade de namespaces que eu não preciso e que tem me atrapalhado. Eu já solicitei que eles alterem o retorno para que seja um XML simples, somente texo. Mas, sabe como é.... se eles não atenderem vou ter que dar um jeito de ler o XML do jeito que está.

 

Suas dicas foram válidas e me ajudaram bastante colega! Já tenho agora um caminho a seguir.

 

Abraços!

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.