Ir para conteúdo

POWERED BY:

Arquivado

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

Paula Torris

[Resolvido] Como ler este típico específco de arquivo XML.

Recommended Posts

Olá Pessoal,

 

Preciso ler um arquivo XML, peguei vários exemplos pela internet porém não consegui bolar um script que consiga ler este tipo de estrutura:

 

Segue abaixo a estrutura de XML a ser lida:

 

<?xml version="1.0" encoding="UTF-8"?>
<!-- Do not edit this file -->
<PLAYERDATA version="1.0" xsi:schemaLocation="http://www.fulltiltpoker.com/schemas/client http://www.fulltiltpoker.com/schemas/client/PlayerNotes.xsd" xmlns="http://www.fulltiltpoker.com/schemas/client" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<NOTES>
<NOTE PlayerId="bellman5569" ColourIx="7" Text="" />
<NOTE PlayerId="cuttnhedz" ColourIx="9" Text="" />
<NOTE PlayerId="Dazzaj" ColourIx="7" Text="" />
</NOTES>
</PLAYERDATA>

Alguém sabe como montar um scriptizinho para ler um arquivo com esta estrutura?

 

Desde já, mto grata,

Até

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só na primeira página de PHP tem uns 3 tópicos que tratam sobre XML, um deles com um sistema PRONTO. Isso sem contar a sessão apropriada de scripts prontos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Amigo,

 

Obrigada por tentar responder, mas não consegui captar a mensagem:

 

Eu tinha achado este exemplo de scriptizinho que le arquivos XML:

 

<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

<?php
$xml = simplexml_load_file("test.xml");

echo $xml->getName() . "<br />";

foreach($xml->children() as $child)
  {
  echo $child->getName() . ": " . $child . "<br />";
  }
?>

Porém não consegui adpatar ao meu arquivo XML,

 

Alguém sabe como fazer?

 

Grata

Até

Compartilhar este post


Link para o post
Compartilhar em outros sites

Porém não consegui adpatar ao meu arquivo XML,

 

Você já leu a documentação da SimpleXML ?

 

Mais especificamente o método SimpleXMLElement::attributes() ?

 

Veja Paula,

 

Seu XML é bastante simples e, tenho certeza que, se você tentar, você irá conseguir.

 

Contudo, caso precise de suporte particular, consulte:

 

Mercado iMasters

 

Oferta para Freelancers

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só na primeira página de PHP tem uns 3 tópicos que tratam sobre XML, um deles com um sistema PRONTO. Isso sem contar a sessão apropriada de scripts prontos.

 

Olá Amigo,

 

Antes de postar, eu tinha dado uma navegada e tentado algo,

 

Inclusive tentei adpatar alguns códigos que vi neste topico:

http://forum.imasters.com.br/index.php?/topic/395862-inserir-node-em-xml/

 

Porém sem sucesso :/

 

Não sei se é pq meu arquivo tá em uma estrutura diferente do tipo:

 

 

<NOTES>
<NOTE PlayerId="bellman5569" ColourIx="7" Text="" />
<NOTE PlayerId="cuttnhedz" ColourIx="9" Text="" />
</NOTES>

em vez de:

 

<NOTES>
<NOTE>
 <PlayerId>bellman5569</PlayerId> 
 <ColourIx>7</ColourIx>
 <Text></Text>
</NOTE>
</NOTES>

É que não manjo muito, e não sei nada de XML, não consegui adpatar o scriptzinho para ler meu arquivo, é pq acredito que ele esteja em uma estrutura diferente,

 

Mas de toda forma mto obrigada por tentar ajudar,

 

Até

Compartilhar este post


Link para o post
Compartilhar em outros sites

Inclusive tentei adpatar alguns códigos que vi neste topico:

http://forum.imaster...ir-node-em-xml/

 

Esse tópico em específico, é realmente um tanto complexo, esqueça-o, apenas lhe trará confusão.

 

Não sei se é pq meu arquivo tá em uma estrutura diferente do tipo:

 

Veja o método SimpleXMLElement::attributes(), veja o primeiro exemplo desse link, tente implementar com o seu XML e, caso não consiga, poste o código que você tentou.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja o método SimpleXMLElement::attributes(), veja o primeiro exemplo desse link,

 

Olá, mto obrigada,

 

O primeiro exemplo do LINK é este:

 

<?php
$string = <<<XML
<a>
 <foo name="one" game="lonely">1</foo>
</a>
XML;

$xml = simplexml_load_string($string);
foreach($xml->foo[0]->attributes() as $a => $B) {
 echo $a,'="',$b,"\"\n";
}
?>

Porém este primeiro exemplo nao utiliza o metodo SimpleXmlElement,

 

Eu fui clicando e fuçando no site e achei um método desta classe

 

Tentei algo mas não deu :/

 

$xmlstr = simplexml_load_file('arquivo.xml');


$sxe = new SimpleXMLElement($xmlstr);

echo $sxe->getName() . "<--";


foreach ($sxe->children() as $child)
{
 echo $child->getName() . "\n";
}

Não sei se to no caminho, to tentando aki alguns exemplos

 

Mas obrigada por tentar ajudar, vou ver se sai alguma coisa aki da minha cabeça de iniciante

Compartilhar este post


Link para o post
Compartilhar em outros sites

Porém este primeiro exemplo nao utiliza o metodo SimpleXmlElement,

 

Não sei se to no caminho, to tentando aki alguns exemplos

 

Está sim, apesar do primeiro exemplo não instanciar SimpleXMLElement, a forma procedural simplexml_load_string() ou simplexml_load_file() carregam um XML de uma string ou arquivo, respectivamente, e transforma seus elementos em instâncias de SimpleXMLElement.

 

Foque-se no primeiro exemplo, ele fará exatamente o que você precisa.

 

Veja só, no primeiro exemplo ele usa o método attributes():

 

foreach($xml->foo[0]->attributes() as $attribute => $value )

 

vou ver se sai alguma coisa aki da minha cabeça de iniciante

 

Compreendo, Paula.

 

Vou lhe dar um norte, continue seus testes a partir do exemplo abaixo:

 

$sxml = simplexml_load_string( $xml ); //Se o seu XML estiver em um arquivo, utilize: simplexml_load_file( 'nome_do_arquivo.xml' );

foreach ( $sxml->children() as $element ){
foreach ( $element->attributes() as $attribute => $value ){
	echo $attribute , '="' , $value , '"' , PHP_EOL;
}

echo '---------------------------' , PHP_EOL;
}

 

Utilizando seu XML, a saída será:

PlayerId="bellman5569"

ColourIx="7"

Text=""

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

PlayerId="cuttnhedz"

ColourIx="9"

Text=""

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

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nossa João, mto obrigada, não só ajudou como acho que já estou quase entendendo o funcionamento dos nós/filhos e tal.

 

O exemplo que você me deu para nortear faltava entrar em mais um nó, apanhei um pouco aqui mais consegui, o resultado final:

 

 


$sxml = simplexml_load_file("arquivo.xml"); 

foreach ( $sxml->children() as $element ){

  foreach($element->children() as $no){

     foreach($no->attributes() as $a => $B)  {

      echo $a .":" . $B . "<br>";
    }

Agora fiz uma gambiarra bem arcaica pra poder inserir no banco de dados a leitura,

 

Gostaria que se possível voce comentasse se está ok, ou sugeriria algo melhor:

 


$sxml = simplexml_load_file("arquivo.xml");

foreach ( $sxml->children() as $element ){

foreach($element->children() as $no) 
{
   foreach($no->attributes() as $a => $B) 
      {
   
		 $cont++;
		 
		 if($cont==1)
		  {
		    $jogador = $B;
		  }
		 
		 if($cont==2)
		 {
                    $texto = $B;
		 }
		 
		 if($cont==3)
		 {
		   $cor = $B;
                   $cont=0;
                   $sql = "INSIRO AQUI A SQL COM OS DADOS $jogador, $texto e $cor NO BANCO DE CADA PASSAGEM PELO NÓ";

		 }
		
		  
      }  


}

}


Será este o melhor jeito de fazer isso mesmo?

 

Se der pra dar um comentário fico agradecida,

 

Mto obrigada,

 

Já descobri que este método que usei é falho :/

 

Em certo momento da leitura, a informação "pula", ou seja, o nome do jogador começa a aparecer no próximo atributo que é COR, e a partir dai começa a todos em diante aparecer em lugares errados :/, isso pq a estrutura muda no meio do arquivo,

 

 

Alguém sabe uma logica para eu fazer isso?

 

O ideal seria pegar os dados diretos de cada atributo:

 

exemplo

 

$sxml = simplexml_load_file("arquivo.xml");

foreach ( $sxml->children() as $element ){

foreach($element->children() as $no) 
{
   foreach($no->attributes() as $a => $B) 
      {
   
             //SITUACAO HIPOTETICA

          $jogador = $B->PlayerId
          $cor = $B->ColourIx

//ALGO ASSIM
                
                  
      }  


}

}


Alguem tem alguma luz?

 

EDIT:

 

Descobri, alias, pensei neh, tava na cara :/

 

$sxml = simplexml_load_file("arquivo.xml");

foreach ( $sxml->children() as $element ){

foreach($element->children() as $no) 
{
   foreach($no->attributes() as $a => $B) 
      {
   
             //SITUACAO HIPOTETICA

         if($a=="PlayerId")
          $jogador = $B;
         
         if($a=="ColourIx")
          $cor = $B;



//ALGO ASSIM
                
                  
      }  


}

}


 

 

Porém bateu uma duvida, não da pra saber quando ele acaba de percorrer o nó?

 

Pq tem nó que vai ter mais atributo, e eu nao sei quando o nó acaba para eu poder fazer a insercao no banco.

 

Alguem tem alguma ideia?

 

 

Grata,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nossa João, mto obrigada, não só ajudou como acho que já estou quase entendendo o funcionamento dos nós/filhos e tal.

 

:D

 

apanhei um pouco aqui mais consegui,

 

http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

 

Gostaria que se possível voce comentasse se está ok, ou sugeriria algo melhor:

 

Veja só, como você tem apenas 3 atributos e eles são conhecidos pela sua aplicação, você não precisa do último loop, onde você utiliza até um contador.

 

Basta que você acesse diretamente os atributos e pegue seus valores:

 

$sxml = simplexml_load_string( $xml ); //Se o seu XML estiver em um arquivo, utilize: simplexml_load_file( 'nome_do_arquivo.xml' );

foreach ( $sxml->children() as $element ) {
foreach ( $element->children() as $note ) {
	$attributes = $note->attributes();
	$playerId = (string) $attributes[ 'PlayerId' ];
	$colourIx = (int) $attributes[ 'ColourIx' ];
	$text = (string) $attributes[ 'Text' ];

	$sql = "INSIRO AQUI A SQL COM OS DADOS $jogador, $texto e $cor NO BANCO DE CADA PASSAGEM PELO NÓ";
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

olá paula, acho que a sua dúvida é bem parecida com a que eu tive a alguns dias aqui no forum, e o joao me ajudou a esclarecer de forma magnifica esse cara é o cara... entao vai algumas dicas pra você, leia os manuais que ele te indicou. segundo acho que você pode ultilizar o mesmo metodo que ele me sugeriu que o "DOM". Se voce notar o meu XML é bem semelhante ao seu. de uma lida geral no tópico depois vá até o final onde consigo resolver o problema acho que la voce vai conseguir sanar suas dúvidas tambem.. ou entao poste o seu xml ai que posso tentar te dar um exemplo bem especifico de como ficaria o DOM no seu código... t+

 

CLIQUE AQUI PARA ACESSAR O TÓPICO - LER XML COM PHP

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Veja só, como você tem apenas 3 atributos e eles são conhecidos pela sua aplicação, você não precisa do último loop, onde você utiliza até um contador.

 

Basta que você acesse diretamente os atributos e pegue seus valores:

 

$sxml = simplexml_load_string( $xml ); //Se o seu XML estiver em um arquivo, utilize: simplexml_load_file( 'nome_do_arquivo.xml' );

foreach ( $sxml->children() as $element ) {
foreach ( $element->children() as $note ) {
	$attributes = $note->attributes();
	$playerId = (string) $attributes[ 'PlayerId' ];
	$colourIx = (int) $attributes[ 'ColourIx' ];
	$text = (string) $attributes[ 'Text' ];

	$sql = "INSIRO AQUI A SQL COM OS DADOS $jogador, $texto e $cor NO BANCO DE CADA PASSAGEM PELO NÓ";
}
}

 

É isso mesmo, mto obrigada por ajudar João,

 

as vezes preciso de um tranco pra pegar, mas é que não sou da área da programação, eu tenho que quebrar uns galhos como sempre,

 

Mto obrigada mesmo, ajudou mto!

 

Até!

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.