Ir para conteúdo
Fórum Script Brasil
  • 0

Manipulando Um Xml


Illidan

Pergunta

Pessoal,

Estou querendo criar uma classe pra manipular XMLs sem ter que instalar qualquer extensão específica no PHP.

Então eu estava fazendo uns testes aqui... só que me deparei com um problema. A idéia era pegar o conteúdo do XML em uma variável, e depois tratar os dados com expressões regulares, passando o conteúdo do XML para um array. Bom, o problema está com a função preg_match_all()... este é meu código:

$xml = '

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

<note type="important">

  <heading>

    <to>Charles</to>

    <from>Jani</from>

  </heading>

  <body>Don\'t forget me this weekend</body>

</note>';

preg_match_all("|<([A-Za-z_][^>\s]*)([^>]*)>(.*?)<\/\\1>|s", $xml, $matches, PREG_SET_ORDER);

// Debugando o retorno da função preg_match_all()

echo '<textarea style="width: 90%; height: 90%;">';

print_r($matches);

echo '</textarea>';

Então, a idéia era que ele casasse as tags, os atributos das tags e os conteúdos, pra depois colocá-los num array... mas quando eu utilizo a preg_match_all, ele vai casar do "<note>" até o "</note>" (as tags "raiz" desse documento), e não vai casar o conteúdo interno dessas tags (como, por exemplo, deveria casar o "<to>Charles</to>" e colocar esses dados em um novo array)... como a função já passou por aquela área (ao casar as tags "raiz"), acho que ela não volta atrás pra tentar realizar novos casamentos...

Alguém sabe se tem como resolver isso?

Muito obrigado! biggrin.gif

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0
tente fazer um while, e ir repetindo o procedimento até quando não tiver mais tags, foi um chute.

Obrigado... mas acho que com o while não daria, pois não tem como informar a cada passagem pelo laço qual área do XML ele deve desconsiderar da análise... né?

Valeu mesmo assim... vou continuar tentando aqui.

Link para o comentário
Compartilhar em outros sites

  • 0

Esse era outro problema... hehehe, mas acho que arrumei uma solução. Por exemplo, este código:

<note type="important">

  <heading>

    <to>Charles</to>

    <from>Jani</from>

  </heading>

  <body>Don't forget me this weekend</body>

</note>

Eu queria transformar num array assim:

$xml['note']['type'] = "important";

$xml['note']['heading']['to'] = "Charles";

$xml['note']['heading']['from'] = "Jani";

$xml['note']['body'] = "Don't forget me this weekend";

Mas aí me depararia com outro problema... por exemplo, dentro do bloco <note>, eu poderia ter mais de um bloco <heading>... aí, na hora de criar o array, o primeiro seria sobreposto sempre pelo último. Então, pensei em criar uma estrutura assim:

$xml[0][0]; // Retorna o conteúdo da primeira tag dentro da raiz

$xml[0][1][0]; // Retorna o conteúdo da primeira tag, que está dentro da segunda tag em relação à raiz

$xml[0][1][1]; // Retorna o conteúdo da segunda tag, que está dentro da segunda tag em relação à raiz

...

E assim por diante, entendeu? Aí, se eu quisesse saber o nome da tag, poderia criar um índice ['tagname'] pra cada novo array, retornando o nome da tag que o originou.

Eu tava vendo aqui, a função preg_match_all() tem uma opção pra devolver a posição do casamento na string... (PREG_OFFSET_CAPTURE). Talvez dê pra fazer alguma coisa com isso...

Abraços! E obrigado...

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado, Fabyo! Ajudou sim...

Eu tinha dado uma olhada nas funções do PHP, mas achei que a xml_parse_create(), por exemplo, necessitaria de uma biblioteca específica... e realmente necessita, mas acabei de ver que essa biblioteca já vem habilitada no PHP.

Valeu! laugh.gif

Link para o comentário
Compartilhar em outros sites

  • 0
beleza, eu tava pensando em postar um exemplo de como ler xml com o php

mas já que você esta fazendo ai e quiser postar la na sessao de script

ate mais

Cara, pode postar! A minha idéia não era criar esse script pra postar lá... fique à vontade, ok? wink.gif

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,4k
    • Posts
      652,2k
×
×
  • Criar Novo...