• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

LuBoc

Parsing XML Multinível --- arghhh!!!

3 mensagens neste tópico

Olá,

Estou a tentar obter informações a partir de um XML multinivel, mas estou com alguns problemas.

Será que me podiam orientar para encontrar uma solução?

Agradeço a ajuda possível.

O XML -- exemplo.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<rss version="2.0">
  <root>   
  	<item name="Nivel 1">  
  		<item name="Item_1_1" url="http://www.exemplo.com/1.php" type="rss" />  
  		<item name="Item_1_2" url="http://www.exemplo.com/2.php" type="rss" />  
  		<item name="Item_1_3" url="http://www.exemplo.com/3.php" type="rss" />  
  		<item name="Item_1_4" url="http://www.exemplo.com/4.php" type="rss" />  
  	</item>
  	<item name="Nivel 2">  
  		<item name="Item_2_1">  
  	            <item name="Item_2_1_1">  
  		            <item name="Item_2_1_1_1" url="http://www.exemplo.com/4.php" type="rss" />  
  		            <item name="Item_2_1_1_2" url="http://www.exemplo.com/4.php" type="rss" />  
                </item>
        </item>
  		<item name="Item_2_2" url="http://www.exemplo.com/4.php" type="rss" />  
  		<item name="Item_2_3" url="http://www.exemplo.com/2.php" type="rss" />  
  		<item name="Item_2_4">  
  		       <item name="Item_2_4_1" url="http://www.exemplo.com/4.php" type="rss" />  
  		       <item name="Item_2_4_2" url="http://www.exemplo.com/4.php" type="rss" />  
        </item>
    </item>
  	<item name="Nivel 3" url="http://www.exemplo.com/n3.php" type="rss" /> 
  </root>
</rss> 

O código que uso para ler o XML -- parseXML($node):

function parseXML($node)
{	
    if (!$node->read())
        return;

    //If this is the root node, then just continue down the tree.
    if ($node->nodeType==XMLReader::ELEMENT && $node->value == "root")
        parseXML($node);

    //If this is a text node then test for attributes.
    if ($node->nodeType==XMLReader::ELEMENT && $node->hasAttributes)
    {
        if ($node->getAttribute("url") != "")
        {
            print "<li>";
            print "<a href=\"" . $node->getAttribute("url") . "\">" . utf8_decode($node->getAttribute("name")) . "</a>";
            if ($node->isEmptyElement) {
               print "</li>"; //only prints closing list tag if item does not have children
            }
            print "\n";
            }            
        }
        else
        {
            print "<li>";
            print utf8_decode($node->getAttribute("name"));
            if ($node->isEmptyElement) {
               print "</li>"; //only prints closing list tag if item does not have children
            print "\n";	            
            }
                        
        }
    }
    //If it is the beginning node then start the list.
    if ($node->nodeType==XMLReader::ELEMENT && !$node->isEmptyElement)
    {
        print "<ul>\n";	
    }

    //If it is the end node then close the list.
    if ($node->nodeType==XMLReader::END_ELEMENT)
    {
        print "</ul>\n";
        if ($node->name == "item") { print "</li>\n"; } //prints closing list tag for item that has children
    }
    //Call the recursive method again.
    parseXML($node);
}


$meuxml = new XMLReader();
$meuxml->open("exemplo.xml");
parseXML($meuxml);
$meuxml->close();

Este parsing devolve uma Tree com a estrutura do RSS.

O que pretendia era por exemplo, obter só os items no Node 0, isto é: Nivel 1, Nivel 2, Nivel 3   sem me importar se eles possuem childs.

Depois, dando por exemplo o Nivel 2, obter a lista de todos os items nesse nível, seria portanto: Item_2_1, Item_2_2, Item_2_3, Item_2_4.

Dando o Item_2_1, obter todos os items respeitantes a esse nível, sendo portanto: Item_2_1_1.

E assim sucessivamente...

Como vêm, dando um Nó, obter-se só os nós existentes que estejam nesse nível e sem importar  os filhos desse nós.

Como é multi nível, terá que ser recursivo.

Como não sei muito das funções XML, vi o SimpleXML, experimentei mas só com tamanhos fixos é que conseguia algum resultado, mas em modo Multinível sem sucesso.

Se alguém souber melhor como implementar isto, dando sugestões de rotinas/instruções que possam contribuir para este caso, agradeço.

Já agora, existe alguém que tenha feito algo assim?!!

Novamente, agradeço a ajuda possível.

Cumprimentos,

LB

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se é para passar rss, atom e afins podes usar o magpie ou coisa parecida, basicamente chamas uma função e aquilo mete-te o feed par um array.

O simplexml nunca usei mas acredito que fará a mesma coisa mas para qualquer tipo de ficheiro.

O nazgulled em tempos afixou um exemplo de leitura e escrita em ficheiro xml:

http://www.portugal-a-programar.pt/index.php?showtopic=3719

Outra coisa que pode ser do teu interesse é o xpath:

http://www.w3schools.com/XPath/default.asp

Eu aconselho-te a usares um parser já com um desenvolvimentos sólido em vez de estares tu a reinventar a roda e abrir espaço para bugs e limitações por todos os cantos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá,

Não é para ser um RSS Feed.

É um XML personalizado, exactamente como o exemplo que coloquei e é multinível, isto é, à partida não sei quantos items e níveis irá ter.

Se puderem dar-me umas luzes nestes pontos:


  • O que pretendia era por exemplo, obter só os items no Node 0, isto é: Nivel 1, Nivel 2, Nivel 3  sem me importar se eles possuem childs.
    Depois, dando por exemplo o Nivel 2, obter a lista de todos os items nesse nível, seria portanto: Item_2_1, Item_2_2, Item_2_3, Item_2_4.
    Dando o Item_2_1, obter todos os items respeitantes a esse nível, sendo portanto: Item_2_1_1.
    E assim sucessivamente...

Cumprimentos,

LB

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora