Jump to content
Omar~

Manipular XML com php

Recommended Posts

Blz?!

Então, vou ser direto. Fiz esse arquivo xml aqui para servir de exemplo para a dúvida:

Spoiler

<?xml version="1.0" encoding="UTF-8"?>
<meu_xml>
    <indice_a>
        <titulo>
            Título 1
        </titulo>
        <descricao>
            Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
        </descricao>
        <tipo>
            teste 1
        </tipo>
    </indice_a>

    <indice_b>
        <titulo>
            Título 2
        </titulo>
        <descricao>
            Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
        </descricao>
        <tipo>
            teste 2
        </tipo>
    </indice_b>
</meu_xml>

 

 

O negócio é o seguinte: Como no exemplo tenho 2 entradas nesse arquivo, como eu faria para manipular elas, até mesmo criar novas ou apagar editando o arquivo?

Porque enquanto a ler os dados sempre fiz, mas daí editar o arquivo estou curioso como proceder

 

Só por mostrar mesmo assim é o exemplo de leitura:

Spoiler

<?php
$file = '/meu_xml.xml';
$xml = simplexml_load_file($file);
if (file_exists($file) && count($xml->$getA)) {
    foreach ($xml->$getA as $item) {
         $item->titulo;
         $item->descricao;
    }
}

 

 

Obtenho o valor do índice vindo pelo $_GET o exibo os valores.

A questão é que esses dados dificilmente serão editados no website, mas serão sim. E para evitar re-enviar o arquivo ou mesmo usar o banco para uma coisa que "raramente" será modificada, estou pensado em realizar isso.

 

Re-escrever todo arquivo? Ou teria uma forma de manipular cada índice?

Share this post


Link to post
Share on other sites

Fala Omar. Tem como você manipular cada índice, tem que usar o DOMDocument pra realizar a alteração. Fiz um exemplo aqui que vai te dar um norte legal:

<?php
$file = 'meu_xml.xml';
$xml = simplexml_load_file($file);

$dom = new DOMDocument("1.0");

// carrega meu_xml.xml
$dom->load($file);
// pega todos os nodes
$root = $dom->documentElement;
// pega o node que você quer percorrer
$indices = $root->getElementsByTagName('indice_a');

foreach ($indices as $indice) {

	// ===========================================================================//
	// 1. aqui você cria um novo node
    $foo_node = $dom->createElement('foo_node', 'aqui vai o valor do novo node');
	// 2. aqui você adiciona o novo node dentro do node indice_a
    $indice->appendchild($foo_node);
    // ===========================================================================//

    // ===========================================================================//
    // aqui você cria um novo node dentro de outro
    // 1. cria o novo node ou pega um já existente
    $baa_node = $dom->createElement('baa_node');
    // 2. adiciona o novo node dentro do node indice_a
    $indice->appendchild($baa_node);
    // 3. adiciona mais um node dentro do node que foi criado anteriormente (baa_node)
    $baa_node->appendchild($dom->createElement("blabla_node", "aqui vai o valor do novo node"));
    // ===========================================================================//

    // ===========================================================================//
    // 1. aqui você pega um node já existente que queira manipular
    $titulo = $indice->getElementsByTagName('titulo')->item(0);
 	// 2. manipule trocando o valor do node, use o ->nodeValue
    $titulo->nodeValue = "alou alouuu";
    // ===========================================================================//

    // ===========================================================================//
    // aqui você pega o conteúdo do node
    // 1. pode usar ->textContent ou ->nodeValue
    $tipo = $indice->getElementsByTagName('tipo')->item(0)->textContent;
    echo $tipo;
    // ===========================================================================//

    // ===========================================================================//
    // 1. descomenta aqui pra você remover o node "descricao"
    // $descricao = $indice->getElementsByTagName('descricao')->item(0);
    // $descricao->parentNode->removeChild($descricao);
    // ===========================================================================//
    
}
// salva as alterações
$dom->save($file);

 

  • +1 1

Share this post


Link to post
Share on other sites

Valeu @BrunoBit vou dar uma olhada melhor

Porque para criar novo índice tenho que fazer:

Buscar todos índices atuais em array > adicionar novo na array > re-salvar o arquivo inteiro.

Para apagar:

Buscar todos índices atuais em array > apagar o índice em questão > re-criar a array > re-salvar com a nova array.

Para editar segue o mesmo esquema de apagar e editar juntos. Tenho que pegar o índices salvar-lo separadamente da array > armazenar então array em um VAR > fazer a edição > inserir o novo índice na VAR > re-fazer o array inicial > re-escrever todo arquivo novamentente.

Share this post


Link to post
Share on other sites

Nesse exemplo que dei dá pra fazer isso, percorrer pelos array, apagar, reescrever, por isso separei os exemplos em blocos. Outro detalhe que esqueci de colocar foi a indentação. Pra indentar o xml no arquivo é só acrescentar essas linhas no início:

$dom = new DOMDocument("1.0");
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;

Pq se não vai ficar um grudado no outro, aí pra ler fica complicado.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By wagner9
      Olá companheiros,
       
      Preciso de ajuda para conseguir implementar um Feed de Notícias de um site parceiro em meu site. O pessoal do site parceiro me enviou os arquivos .xml, mas não consegui descobrir como implementar eles no meu site.
       
      Se alguem puder me ajudar, fico grato.
    • By manigold
      Estou com um pequeno problema nessa parte:
      $monsters = simplexml_load_file($otdir . '/data/monster/monsters.xml') or die('<b>Could not load monsters!</b>'); foreach($monsters->monster as $monster) { $loot = simplexml_load_file($otdir . '/data/monster/' . $monster['file']); if($loot) { if($item = $loot->loot->item){ A pagina mostra a lista de items corretamente mas se eu tenho um item dentro de outro item ,como nesse exemplo:
      <loot> <item id="2148" countmax="100" chance="33750" /> <item id="2148" countmax="100" chance="33750" /> <item id="2672" countmax="5" chance="80000" /> <item id="7399" chance="80" /> <item id="2392" chance="1428" /> <item id="2033" chance="3190" /> <item id="2547" countmax="7" chance="6700" /> <item id="5948" chance="3040" /> <item id="1987" chance="100000"> <!-- bag --> O PROBLEMA É NESSA PARTE <item id="5882" chance="5920" /> <item id="2498" chance="888" /> <item id="7378" countmax="3" chance="8800" /> <item id="2146" chance="5300" /> <item id="2414" chance="1500"/> <item id="2528" chance="2333" /> <item id="7402" chance="2000" /> <item id="2492" chance="730" /> </item> </loot> Os items dentro do item com id 1987 não são mostrados .
      Me desculpem se a explicação não esta muito boa , não entendo nada de php e xml ,eu agradeço se alguem puder me ajudar.
    • By neoandrevictor
      Bom dia,
       
      Como faço para gerar um arquivo .doc (Microsoft Word) através de javascript com margens customizadas? Sei que para gerar o css corretamente tenho que gerar inline mas não consigo definir a margem de jeito algum.
       
      Poderiam me ajudar por gentileza?
    • By Jefferson andre
      Saudações mestres,
       
      Qual o comando utilizado para criar um arquivo em alguma pasta que eu selecionar onde eu possa ir escrevendo dentro as linhas do XML?
       
      Não quero algo pronto, preciso escrever linha a linha de acordo com o manual da Sefaz.
       
      Grato
    • By ZeroEnd
      Boa tarde.

      Nao tenho muito conhecimento em javascript mas estou aprendendo aos poucos.

      Minha dúvida é sobre Xpath, bom na verdade eu entendi de forma básica como fazer uma busca usando Xpath, tanto é que para isso eu estava usando o programa Xpath Visualizer para entender.
      Mas eu não achei como empregar isso em uma página html, usando as mesmas variáveis que uso no programa para ter o mesmo resultado.
      Gostaria de saber se em algum lugar a informações de forma simples ou algo para tomar uma direção.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.