Jump to content
Fórum Script Brasil
  • 0

Manipulando Um Xml


Illidan

Question

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 to comment
Share on other sites

8 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...