Ir para conteúdo

POWERED BY:

Arquivado

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

leo_SJCampos

Como colocar valor de TAG XML em variavel PHP

Recommended Posts

Olá Galera, como fazer para pegar o valor de uma tag XML em variavel do PHP?

 

só tem um problema.. a TAG é uma tag especial

 

<?xml version="1.0" encoding="ISO-8859-1" ?>
<ans:mensagemTISS xmlns="http://www.w3.org/2001/XMLSchema" xmlns:ans="http://www.ans.gov.br/padroes/tiss/schemas">
<ans:cabecalho>
<ans:identificacaoTransacao>
<ans:tipoTransacao>ENVIO_LOTE_GUIAS</ans:tipoTransacao>
<ans:sequencialTransacao>27</ans:sequencialTransacao>
<ans:dataRegistroTransacao>2009-12-01</ans:dataRegistroTransacao>
<ans:horaRegistroTransacao>11:31:08</ans:horaRegistroTransacao>
</ans:identificacaoTransacao>
<ans:origem>
<ans:codigoPrestadorNaOperadora>
<ans:codigoPrestadorNaOperadora>456216454</ans:codigoPrestadorNaOperadora>
</ans:codigoPrestadorNaOperadora>
</ans:origem>
<ans:destino>
<ans:registroANS>456456</ans:registroANS>
</ans:destino>
<ans:versaoPadrao>2.02.01</ans:versaoPadrao>
</ans:cabecalho>
<ans:prestadorParaOperadora>
<ans:loteGuias>
<ans:numeroLote>38</ans:numeroLote>

reparem que o campo as tags vem com o : no meio. nao sei o que é isso?

 

Como colocar o valor do ultimo campo numeroLote em uma variavel PHP?]

 

Prometo que esse será o ultimo post do mes.. hehehe

 

Valeu galera

 

achei isso.. ele consegue ler o xml, mas eu queria somente o valor de uma tag, nao sei como pegar... e meu arquivo XML é um pouco diferente... vou postar um pedaço dele...

 

<teste>
<cadastro id = "56">
<nome>Slackware</nome>
<email>slackware@linux.com.br</email>
</cadastro>
</teste> 

<?php
header("Content-Type:text/html; charset=ISO-8859-1",true); 

/*Cria um objeto SimpleXML a partir do XML*/
$xml = simplexml_load_file("teste.xml");

$string = "";

/*Retorna a quantidade de nodos cadastro*/
//$quantidade_cadastro = count($xml->cadastro);

/*Percorre todos as tags cadastro existentes em $xml*/

//$xml = str_replace("ANS:", "", $xml);

foreach($xml->cadastro as $cadastros)
{
/*Retorna o nome da tag*/
echo $cadastros->getName(). "<br />";

/*Percorre todos os atributos da tag cadastro*/ 
foreach($cadastros->attributes() as $atributos)
{
/*Retorna o nome do atributo*/
$string .= $atributos->getName(). " : ";

/*Retorna o valor do atributo*/
$string .= $atributos. "<br />";

echo $string;
}

/*Percorre todas as tags dentro de cada cadastro*/
foreach($cadastros->children() as $campos)
{
echo $campos->getName(). " : ". $campos. "<br />";
}
}

/*Imprime todo o conteúdo do $xml. obs.: não retorna o atributo das tags*/
echo "<br /><br />". $xml->asXML();
?>

 

Meu XML

<?xml version="1.0" encoding="ISO-8859-1" ?>
<ans:mensagemTISS xmlns="http://www.w3.org/2001/XMLSchema" xmlns:ans="http://www.ans.gov.br/padroes/tiss/schemas">
<ans:cabecalho>
<ans:identificacaoTransacao>
<ans:tipoTransacao>ENVIO_LOTE_GUIAS</ans:tipoTransacao>
<ans:sequencialTransacao>27</ans:sequencialTransacao>
<ans:dataRegistroTransacao>2009-12-01</ans:dataRegistroTransacao>
<ans:horaRegistroTransacao>11:31:08</ans:horaRegistroTransacao>
</ans:identificacaoTransacao>
<ans:origem>
<ans:codigoPrestadorNaOperadora>
<ans:codigoPrestadorNaOperadora>50456664000138</ans:codigoPrestadorNaOperadora>
</ans:codigoPrestadorNaOperadora>
</ans:origem>
<ans:destino>
<ans:registroANS>413275</ans:registroANS>
</ans:destino>
<ans:versaoPadrao>2.02.01</ans:versaoPadrao>
</ans:cabecalho>
<ans:prestadorParaOperadora>
<ans:loteGuias>
<ans:numeroLote>38</ans:numeroLote>
<ans:guias>

eu só preciso do valor desse numeroLote que é 38

Alguem poderia me ajudar com isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compartilhar este post


Link para o post
Compartilhar em outros sites

valeu pela resposta ai brother...

 

seu exemplo funcionou legal, só que com o meu nao consegui ainda... o meu XML alem de ser um nó dentro do outro, tem um negocio meio estranho... exemplo... (só um trecho dele)

 

</ans:cabecalho>
<ans:prestadorParaOperadora>
   <ans:loteGuias>
      <ans:numeroLote>38</ans:numeroLote>

esse "ans:"atrapalha bastante.. ai tentei tirara-lo assim:

 

$name = str_replace("ANS:", "", $ver);

mas nao obtive sucesso ainda...

 

o que eu poderia fazer para isso funcionar... e o xml sendo uma tag dentro de outra eu faria desssa forma?

 

print $name->prestadorParaOperadora->loteGuias->numeroLote[0];

valeu pela ajuda

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compartilhar este post


Link para o post
Compartilhar em outros sites

olha o exemplo no manual:

 

$sxe = new SimpleXMLElement($xml);

$sxe->registerXPathNamespace('c', 'http://example.org/chapter-title');
$result = $sxe->xpath('//c:title');

no seu caso seria assim:

$sxe = new SimpleXMLElement($xml);

$sxe->registerXPathNamespace('ans', 'http://www.ans.gov.br/padroes/tiss/schemas');
$result = $sxe->xpath('ans:numeroLote');

Compartilhar este post


Link para o post
Compartilhar em outros sites

puts deram varios erros...

 

Warning: SimpleXMLElement::__construct() [function.SimpleXMLElement---construct]: Entity: line 5: parser error : Start tag expected, '<' not found in C:\wamp\www\teste\index.php on line 7

 

Warning: SimpleXMLElement::__construct() [function.SimpleXMLElement---construct]: in C:\wamp\www\teste\index.php on line 7

 

Warning: SimpleXMLElement::__construct() [function.SimpleXMLElement---construct]: ^ in C:\wamp\www\teste\index.php on line 7

 

Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in C:\wamp\www\teste\index.php:7 Stack trace: #0 C:\wamp\www\teste\index.php(7): SimpleXMLElement->__construct('????') #1 {main} thrown in C:\wamp\www\teste\index.php on line 7

Compartilhar este post


Link para o post
Compartilhar em outros sites

seu XML está mal formado ou incompleto

 

veja a diferença:

<?php
$xml = <<<XML
<?xml version="1.0" encoding="ISO-8859-1" ?>
<ans:mensagemTISS xmlns="http://www.w3.org/2001/XMLSchema" xmlns:ans="http://www.ans.gov.br/padroes/tiss/schemas">
	<ans:cabecalho>
		<ans:identificacaoTransacao>
			<ans:tipoTransacao>ENVIO_LOTE_GUIAS</ans:tipoTransacao>
			<ans:sequencialTransacao>27</ans:sequencialTransacao>
			<ans:dataRegistroTransacao>2009-12-01</ans:dataRegistroTransacao>
			<ans:horaRegistroTransacao>11:31:08</ans:horaRegistroTransacao>
		</ans:identificacaoTransacao>
		<ans:origem>
			<ans:codigoPrestadorNaOperadora>
				<ans:codigoPrestadorNaOperadora>50456664000138</ans:codigoPrestadorNaOperadora>
			</ans:codigoPrestadorNaOperadora>
		</ans:origem>
		<ans:destino>
			<ans:registroANS>413275</ans:registroANS>
		</ans:destino>
		<ans:versaoPadrao>2.02.01</ans:versaoPadrao>
	</ans:cabecalho>
	<ans:prestadorParaOperadora/>
	<ans:loteGuias/>
	<ans:numeroLote>38</ans:numeroLote>
	<ans:guias/>
</ans:mensagemTISS>
XML;

$file = simplexml_load_string($xml);
$file->registerXPathNamespace('ans', 'http://www.ans.gov.br/padroes/tiss/schemas');
$lote = $file->xpath('ans:numeroLote');
echo $lote[0];
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

o que significa esse <<<XML antes de começar o xml propriamente dito ?

do jeito que você me mandou assim, funcionou, só que meu arquivo não ta junto com o arquivo que exibe o conteudo igual voce postou ai, eu pego ele atraves do simplexml_load_file("teste3.xml") e o mesmo nao vem com esse <<<XML

 

entendeu?

Compartilhar este post


Link para o post
Compartilhar em outros sites

é um formato incomum de echo

 

http://en.wikipedia.org/wiki/Here_document

 

http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc

 

É mais utilizado para fazer documentação. Mas eu gosto quando preciso escrever um bloco grande de informações em uma outra linguagem

 

é equivalente a um grande echo "";

 

basta trocar simplexml_load_string() por simplexml_load_file()

 

só lembrando que se seu XML estiver mal formado, não vai funcionar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola boa noite sou nono no forum e estoum com um problemao preciso ler um arquivo xml assim

 

<?xml version="1.0" encoding="ISO-8859-1"?>

<ans:mensagemTISS xmlns:ans="http://www.ans.gov.br/padroes/tiss/schemas"'>http://www.ans.gov.br/padroes/tiss/schemas" xmlns:ns2="http://www.w3.org/2001/XMLSchema-instance" ns2:schemaLocation="http://www.ans.gov.br/padroes/tiss/schemas http://www.ans.gov.br/padroes/tiss/schemas/tissV2_02_01.xsd">

<ans:cabecalho>

<ans:identificacaoTransacao>

<ans:tipoTransacao>DEMONSTRATIVO_ANALISE_CONTA</ans:tipoTransacao>

<ans:sequencialTransacao>1</ans:sequencialTransacao>

<ans:dataRegistroTransacao>2010-08-09</ans:dataRegistroTransacao>

<ans:horaRegistroTransacao>20:00:13</ans:horaRegistroTransacao>

</ans:identificacaoTransacao>

<ans:origem>

<ans:registroANS>335100</ans:registroANS>

</ans:origem>

<ans:destino>

<ans:codigoPrestadorNaOperadora>

<ans:codigoPrestadorNaOperadora>110001</ans:codigoPrestadorNaOperadora>

</ans:codigoPrestadorNaOperadora>

</ans:destino>

<ans:versaoPadrao>2.02.01</ans:versaoPadrao>

</ans:cabecalho>

<ans:operadoraParaPrestador>

<ans:demonstrativosRetorno>

<ans:demonstrativoAnaliseConta>

<ans:identificacaoFontePagadora>

<ans:operadoraRegulada>

<ans:registroANS>335100</ans:registroANS>

<ans:CNPJ>xxxx</ans:CNPJ>

<ans:nomeOperadora>teste</ans:nomeOperadora>

</ans:operadoraRegulada>

</ans:identificacaoFontePagadora>

<ans:cabecalhoDemonstrativo>

<ans:numeroDemonstrativo>MANUAL</ans:numeroDemonstrativo>

<ans:dataEmissao>2010-08-09</ans:dataEmissao>

</ans:cabecalhoDemonstrativo>

<ans:dadosPrestador>

<ans:identificacao>

<ans:codigoPrestadorNaOperadora>1zzzz</ans:codigoPrestadorNaOperadora>

</ans:identificacao>

<ans:nomeContratado>HOSP </ans:nomeContratado>

</ans:dadosPrestador>

<ans:fatura>

<ans:dadosFatura>

<ans:numeroFatura>MANUAL</ans:numeroFatura>

<ans:lote>

<ans:dadosLote>

<ans:numeroLote>MANUAL</ans:numeroLote>

<ans:dataEnvioLote>2010-04-07</ans:dataEnvioLote>

<ans:numeroProtocolo>MANUAL</ans:numeroProtocolo>

<ans:valorProtocolo>162.84</ans:valorProtocolo>

<ans:valorGlosaProtocolo>16449.65</ans:valorGlosaProtocolo>

<ans:guia>

<ans:dadosGuia>

<ans:numeroGuiaPrestador></ans:numeroGuiaPrestador>

<ans:numeroGuiaOperadora>206242005</ans:numeroGuiaOperadora>

<ans:beneficiario>

<ans:numeroCarteira>030046azazaza0311010</ans:numeroCarteira>

<ans:nomeBeneficiario>JUCA</ans:nomeBeneficiario>

<ans:nomePlano>INTERCAMBIO</ans:nomePlano>

</ans:beneficiario>

 

 

preciso pegar <ans:nomeBeneficiario>JUCA</ans:nomeBeneficiario>..... useri os exemplos acima... porem no meu XML ele nao reconhece os objetos... o q seria esse XPATH... uma vez que tenho padrao ans e ns2... como importo os 2... como faria pra achar estes elementos neste xml...

 

aGRADEÇO QUEM PUDER ME AJUDAR... POIS ESTOU QUEBRANDO A CABEÇA E NAO CONSIGO ACHAR A SOLUÇÃO....

 

VLW OBRIGADO

Compartilhar este post


Link para o post
Compartilhar em outros sites

mais um caso de xml mal-formado.

 

A interpretação XML falhou

 

A interpretação XML falhou: erro de sintaxe (Linha: 58, Caractere: 19)

 

Erro:

unexpected end-of-file

 

Especificação:

http://www.w3.org/TR/REC-xml/

 55: <ans:numeroCarteira>030046azazaza0311010</ans:numeroCarteira>
 56: <ans:nomeBeneficiario>JUCA</ans:nomeBeneficiario>
 57: <ans:nomePlano>INTERCAMBIO</ans:nomePlano>
 58: </ans:beneficiario>

Compartilhar este post


Link para o post
Compartilhar em outros sites

entao evandro me desculpa... na verdade eu nao postei o XML inteiro pois ele tem 20 MB e se for postar ira ficar muito grande...

 

entao na verdade eu so postei 34 linhas do mesmo ele tem mais de 100 mil linhas ... mas assim eu ja fiz a verificação do mesmo esta correto, esta arquivo já foi ate lido pela UNIMED, o unico problema é que desde arquivo eu preciso pegar algumas informações como o nome, e alguns outros valores que possuem dentro do mesmo...

 

 

você tem alguma ideia de como posso fazer esta busca... neste arquivo se você reparar ele começa

 

<ans:mensagemTISS xmlns:ans="http://www.ans.gov.br/padroes/tiss/schemas" xmlns:ns2="http://www.w3.org/2001/XMLSchema-instance" ns2:schemaLocation="http://www.ans.gov.br/padroes/tiss/schemas http://www.ans.gov.br/padroes/tiss/schemas/tissV2_02_01.xsd">

 

como eue colocaria isso no meu registerXPathNamespace ... e outra coisa .. se eu usar este exemplo que foi postado ele não da erro porem ele nao consegue achar as informações ... eu fiz assim

 

 

 

$caminho=$_POST['caminho'];

 

$file = simplexml_load_file($caminho);

$file->registerXPathNamespace('ans','http://www.ans.gov.br/padroes/tiss/schemas');

$file->registerXPathNamespace('ns2','http://www.ans.gov.br/padroes/tiss/schemas http://www.ans.gov.br/padroes/tiss/schemas/tissV2_02_01.xsd');

 

 

$nome= $file->xpath('ans:nomeBeneficiario');

print_r($nome[0]);

 

neste caso era para aparecer o primeiro nome de muitos...

 

 

 

 

 

mais um caso de xml mal-formado.

 

A interpretação XML falhou

 

A interpretação XML falhou: erro de sintaxe (Linha: 58, Caractere: 19)

 

Erro:

unexpected end-of-file

 

Especificação:

http://www.w3.org/TR/REC-xml/

 55: <ans:numeroCarteira>030046azazaza0311010</ans:numeroCarteira>
 56: <ans:nomeBeneficiario>JUCA</ans:nomeBeneficiario>
 57: <ans:nomePlano>INTERCAMBIO</ans:nomePlano>
 58: </ans:beneficiario>

Se for o caso eu envio o XML completo em seu email para que você possa dar uma olhada pode ser?!

 

e ai galera alguem tem alguma ideia do que eu posso fazer neste caso!?!?

Compartilhar este post


Link para o post
Compartilhar em outros sites

sidnei amadeu, no xpath você tem que fornecer o caminho do nó a partir do nó atual (no seu caso o de $file, que é a root do XML):

$nome = $file->xpath('meu_filho/meu_neto/meu_bisneto');

Também é possível acessar o 'meu_bisneto' diretamente:

$nome = $file->xpath('//meu_bisneto');

No seu caso, pode funcionar este último, ficaria assim:

$nome = $file->xpath('//ans:nomeBeneficiario');

Mas tome cuidado, qualquer nó com nome ans:nomeBeneficiario será retornado, mesmo que não esteja naquele caminho que você queria. Se no seu XML, todos os ans:nomeBeneficiario possuem este mesmo caminho, não deve haver problemas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Blza... já vou fazer o teste pra verificar se assim funciona... obrigado... valeu mesmo!!! qq coisa se nao der certo ou mesmo que de eu posto aqui obrigado!

 

 

sidnei amadeu, no xpath você tem que fornecer o caminho do nó a partir do nó atual (no seu caso o de $file, que é a root do XML):

$nome = $file->xpath('meu_filho/meu_neto/meu_bisneto');

Também é possível acessar o 'meu_bisneto' diretamente:

$nome = $file->xpath('//meu_bisneto');

No seu caso, pode funcionar este último, ficaria assim:

$nome = $file->xpath('//ans:nomeBeneficiario');

Mas tome cuidado, qualquer nó com nome ans:nomeBeneficiario será retornado, mesmo que não esteja naquele caminho que você queria. Se no seu XML, todos os ans:nomeBeneficiario possuem este mesmo caminho, não deve haver problemas.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

kra consegui fazer do jeito

 

$nome = $file->xpath('//ans:nomeBeneficiario');

 

porem o 1º jeito $nome = $file->xpath('meu_filho/meu_neto/meu_bisneto'); ... nao deu certo .... eu comecei pelo nó .. <ans:mensagemTISS ... será que é isso mesmo ?!?!

Compartilhar este post


Link para o post
Compartilhar em outros sites

GALERA só mais uma duvida... agora consegui ler certinho... porem como faço pra ler somente o nós filhos de um determinado nor por exemplo... quero ler todos os nós filho onde o nó guia é igual a 450

 

como eu faço isso... uma vez que para cada beneficiario eu tenho n itens usados para o mesmo...

 

entenderam?!?!

Compartilhar este post


Link para o post
Compartilhar em outros sites

GALERA só mais uma duvida... agora consegui ler certinho... porem como faço pra ler somente o nós filhos de um determinado nor por exemplo... quero ler todos os nós filho onde o nó guia é igual a 450

 

como eu faço isso... uma vez que para cada beneficiario eu tenho n itens usados para o mesmo...

 

entenderam?!?!

 

Dá uma olhada na primeira tabela desta página:

http://www.zvon.org/xxl/XPathTutorial/Output/example3.html

 

Onde tem /AAA/CCC/DDD/*.

 

Vê se te ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ola boa tarde,

 

Haz, eu dei uma olhada neste exmplos porem ainda não consegui abrir a minha cabeça pra entender isso ... por exemplo...

 

imagina assim eu tenha a guia 156 que tem tylenol e doril e tenho a guia 157 que tem magnopiral...

 

quando vou mostrar aparece assim ...

 

guia numero :156

medicamentos: tylenol, doril e magnopiral

 

guia numero :157

medicamentos: tylenol, doril e magnopiral

 

 

endenteu?! eu nao consigo associar que na guia 156 foram apenas o tylenol e o doril...

 

será que voc~e tem alguma luz?!

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.