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 volanick
      Tenho um código que faz a leitura de varios xml (fiscal), e grava o que encontrou em um banco de dados. Como posso ler este arquivo, e salvar quando tem mais de 1 produto no xml? No momento ele salva apenas o primeiro item de cada arquivo xml. foreach(glob('xml/*/*/*/{*.xml,*.XML}', GLOB_BRACE) as $xmlFile){ $xml = simplexml_load_file($xmlFile); $chNFe= $xml->protNFe->infProt->chNFe; $dhEmi= $xml->NFe->infNFe->ide->dhEmi; $natOp= $xml->NFe->infNFe->ide->natOp; $CNPJ= $xml->NFe->infNFe->emit->CNPJ; $xNomeemit= $xml->NFe->infNFe->emit->xNome; $xBairroemit= $xml->NFe->infNFe->emit->enderEmit->xBairro; $xMunemit= $xml->NFe->infNFe->emit->enderEmit->xMun; $UFemit= $xml->NFe->infNFe->emit->enderEmit->UF; $foneemit= $xml->NFe->infNFe->emit->enderEmit->fone; $cPaisemit= $xml->NFe->infNFe->emit->enderEmit->cPais; $CPFdest= $xml->NFe->infNFe->dest->CPF; $CNPJdest= $xml->NFe->infNFe->dest->CNPJ; $xNome= $xml->NFe->infNFe->dest->xNome; $xLgr= str_replace("'","",$xml->NFe->infNFe->dest->enderDest->xLgr); $nro= $xml->NFe->infNFe->dest->enderDest->nro; $xBairro= $xml->NFe->infNFe->dest->enderDest->xBairro; $xMun= $xml->NFe->infNFe->dest->enderDest->xMun; $UF= $xml->NFe->infNFe->dest->enderDest->UF; $CEP= $xml->NFe->infNFe->dest->enderDest->CEP; $cPais= $xml->NFe->infNFe->dest->enderDest->cPais; $email= $xml->NFe->infNFe->dest->email; $xProd= $xml->NFe->infNFe->det->prod->xProd; $NCM= $xml->NFe->infNFe->det->prod->NCM; $CFOP= $xml->NFe->infNFe->det->prod->CFOP; $uCom= $xml->NFe->infNFe->det->prod->uCom; $qCom= $xml->NFe->infNFe->det->prod->qCom; $vProd= $xml->NFe->infNFe->det->prod->vProd; $vUnTrib= $xml->NFe->infNFe->det->prod->vUnTrib; $checkn = "SELECT * FROM xml WHERE chNFe = '$chNFe'"; $sqlcheckn = mysqli_query($conn, $checkn); $rowsn = mysqli_num_rows($sqlcheckn); if ($rowsn == 0) { $sql="INSERT INTO xml ( chNFe, dhEmi, natOp, CNPJ, xNomeemit, xBairroemit, xMunemit, UFemit, foneemit, cPaisemit, CPFdest, CNPJdest, xNome, xLgr, nro, xBairro, xMun, UF, CEP, cPais, email, xProd, NCM, CFOP, uCom, qCom, vProd, vUnTrib ) VALUES( '$chNFe', '$dhEmi', '$natOp', '$CNPJ', '$xNomeemit', '$xBairroemit', '$xMunemit', '$UFemit', '$foneemit', '$cPaisemit', '$CPFdest', '$CNPJdest', '$xNome', '$xLgr', '$nro', '$xBairro', '$xMun', '$UF', '$CEP', '$cPais', '$email', '$xProd', '$NCM', '$CFOP', '$uCom', '$qCom', '$vProd', '$vUnTrib' )"; $res = mysqli_query($conn, $sql) or die("<b>Erro (0):</b><br> $sql <br> <b>Mensagem tecnica:</b> <br>" .mysqli_error()); if(mysqli_affected_rows() != -1){ $x++; } echo "<br>$x registros importados com sucesso!<br>"; } else { echo "<br>Jรก encontremos dados com estas notas!<br>"; } }  
       
    • By edionas
      Bom dia,
      a tempos venho tentando exibir o conteudo dos links abaixo na forma de tabela organizada, usando importação dos dados atraves do link:
      http://api.tcm.ce.gov.br/sim/1_0/licitacoes?codigo_municipio=002&data_realizacao_autuacao_licitacao=20100101_20100115
      http://api.tcm.ce.gov.br/sim/1_0/licitacoes.xml?codigo_municipio=002&data_realizacao_autuacao_licitacao=20100101_20100115
      http://api.tcm.ce.gov.br/sim/1_0/licitacoes.json?codigo_municipio=002&data_realizacao_autuacao_licitacao=20100101_20100115
      Porem não tenho conseguido exito.
    • By Marcel Amorim
      Olá pessoal boa noite. Sou novo aqui no fórum e este é o meu primeiro post. Estou tentando configurar a ambiente de emissão da NF-e com o PHP porém estou tendo alguns problemas.
      Estou usando o PHP 7.2.
      Estou preenchendo os campos da nota e quando chamo a função getXML() ele não me retorna nada.
       
      A parte da função é essa:
      $xml = $nfe->getXML(); está me retornando um $xml vazio. Não vem com os dados preenchidos. Acredito que deve ser alguma configuração faltando mas não consigo identificar o problema.
      Nem mesmo um xml ele me retorna.
      Alguém poderia me ajudar neste sentido?
       
      att,
      Marcel Amorim
       
    • By Webster Moitinho
      Estou usando switch em minha página PHP, e para um dos cases está aparecendo o erro abaixo que eu não consigo identificar
       
      <Error><Code>BlobNotFound</Code><Message>The specified blob does not exist. RequestId:00c4ed11-e01e-0068-2b3a-575edd000000 Time:2019-08-20T09:33:50.2842035Z</Message></Error> Esse case chama o seguinte conteúdo do banco de dados:
      <p align="justify">Ao capacitar o seu <em>staff</em> de maneira satisfat&oacute;ria, a empresa assegura a qualidade do produto final ao cliente, influenciando de maneira significativa os resultados. Atrav&eacute;s da implanta&ccedil;&atilde;o de programas sistem&aacute;ticos de treinamento, pode-se proporcionar a melhoria do produto, al&eacute;m de serem dotados de forte apelo motivacional para a equipe, promovendo o desenvolvimento profissional espont&acirc;nea e naturalmente. &Eacute; comum nas corpora&ccedil;&otilde;es que o colaborador, ap&oacute;s algum tempo de capacita&ccedil;&atilde;o, busque melhores oportunidades no mercado, fazendo com que o empres&aacute;rio perca seu investimento. Todavia, n&atilde;o capacitar tamb&eacute;m tem o seu custo. E &eacute; bastante alto. Da&iacute; a import&acirc;ncia da forma&ccedil;&atilde;o continuada nas empresas, promovendo constantes atualiza&ccedil;&otilde;es e reciclagens dos profissionais.</p> <p align="justify"> <h4 style="text-align:left">Quanto custa n&atilde;o capacitar </h4> <ul style="margin-left: 5px;text-align:left; line-height: 35px; font-family: padrao;"> <li style="font-size:12pt;" ><i class="fa fa-frown fa-fw" style="font-size:18pt; color: #FF0000;"></i> &nbsp;&nbsp;Atendimento incompleto ou n&atilde;o compat&iacute;vel com a expectativa da empresa e do cliente.</li> <li style="font-size:12pt;" ><i class="fa fa-frown fa-fw" style="font-size:18pt; color: #FF0000;"></i> &nbsp;&nbsp;Perda de neg&oacute;cios.</li> <li style="font-size:12pt;" ><i class="fa fa-frown fa-fw" style="font-size:18pt; color: #FF0000;"></i> &nbsp;&nbsp;Insatisfa&ccedil;&atilde;o de clientes.</li> <li style="font-size:12pt;" ><i class="fa fa-frown fa-fw" style="font-size:18pt; color: #FF0000;"></i> &nbsp;&nbsp;Redu&ccedil;&atilde;o do valor da marca.</li> <li style="font-size:12pt;" ><i class="fa fa-frown fa-fw" style="font-size:18pt; color: #FF0000;"></i> &nbsp;&nbsp;N&atilde;o cumprimento de metas.</li> <li style="font-size:12pt;" ><i class="fa fa-frown fa-fw" style="font-size:18pt; color: #FF0000;"></i> &nbsp;&nbsp;Alto &iacute;ndice de <em>turnover</em>.</li> <li style="font-size:12pt;" ><i class="fa fa-frown fa-fw" style="font-size:18pt; color: #FF0000;"></i> &nbsp;&nbsp;Insatisfa&ccedil;&atilde;o do funcion&aacute;rio.</li> <li style="font-size:12pt;" ><i class="fa fa-frown fa-fw" style="font-size:18pt; color: #FF0000;"></i> &nbsp;&nbsp;Custos com retrabalho.</li> <li style="font-size:12pt;" ><i class="fa fa-frown fa-fw" style="font-size:18pt; color: #FF0000;"></i> &nbsp;&nbsp;Sobrecarga de alguns funcion&aacute;rios (via de regra, aqueles melhores preparados).</li> <li style="font-size:12pt;" ><i class="fa fa-frown fa-fw" style="font-size:18pt; color: #FF0000;"></i> &nbsp;&nbsp;Redu&ccedil;&atilde;o da lucratividade.</li> <li style="font-size:12pt;" ><i class="fa fa-frown fa-fw" style="font-size:18pt; color: #FF0000;"></i> &nbsp;&nbsp;Redu&ccedil;&atilde;o de faturamento.</li> </ul> <h4 style="text-align:left">O que o mercado est&aacute; fazendo para melhorar na gest&atilde;o e formar seus profissionais?</h4> <p style="text-align:left">Segundo estudos realizados pelo <a href="http://www.vistage.com.br/grupos-vistage" title="V&aacute; para o site" target="_blank" class="zloko">Grupo Vistage Brasil</a>:</p> <ul style="margin-left: 5px;text-align:left; line-height: 35px; font-family: padrao;"> <li style="font-size:12pt;" ><i class="fa fa-user-graduate fa-fw" style="font-size:18pt; color: #009900;"></i> &nbsp;&nbsp;Apenas 14&#37; dos executivos brasileiros n&atilde;o tem problemas ao buscar profissionais qualificados.</li> <li style="font-size:12pt;" ><i class="fa fa-user-graduate fa-fw" style="font-size:18pt; color: #009900;"></i> &nbsp;&nbsp;H&aacute; falta de m&atilde;o de obra qualificada para todos os n&iacute;veis de fun&ccedil;&atilde;o.</li> <li style="font-size:12pt;" ><i class="fa fa-user-graduate fa-fw" style="font-size:18pt; color: #009900;"></i> &nbsp;&nbsp;As maiores demandas s&atilde;o para profissionais com forma&ccedil;&atilde;o superior para a &aacute;rea de atua&ccedil;&atilde;o da empresa (65%) e forma&ccedil;&atilde;o t&eacute;cnica (60%).</li> </ul> </p> <p align="justify">Uma pesquisa do Jornal Bom Dia Brasil mostrou onde est&aacute; o emprego nas m&eacute;dias e grandes empresas. S&atilde;o setores onde sobram vagas porque falta qualifica&ccedil;&atilde;o e &aacute;reas onde o curso t&eacute;cnico j&aacute; garante a contrata&ccedil;&atilde;o. O curso t&eacute;cnico &eacute; suficiente para abrir as portas de entrada no mercado de trabalho.<br /> Entre as ind&uacute;strias pesquisadas, 65% reclamam da falta de m&atilde;o de obra especializada. As m&eacute;dias e grandes empresas procuram operadores.</p> <p align="justify">Exatamente o caso dessa empresa de automa&ccedil;&atilde;o de port&otilde;es em Bras&iacute;lia. &ldquo;A gente perde com nossa produtividade. A gente n&atilde;o consegue inovar com frequencia porque as pessoas n&atilde;o conseguem acompanhar essa demanda&rdquo;, afirma a gerente de RH Clara Moreira. <p style="text-align:justify;">A sa&iacute;da das empresas tem sido treinar os empregados: 81% fizeram investimentos em cursos dentro da pr&oacute;pria empresa. O que tamb&eacute;m n&atilde;o &eacute; f&aacute;cil, porque a maioria chega despreparada.</p> <h4 style="text-align:left;">Áreas dos cursos Gopinatha</h4> <br /> <div style="float:left; width:100%;"> <img src="images/colmeia.png" id="map-image" style="width: 480px; max-width: 100%; height: auto;" alt="" usemap="#cursos" /> <map name="cursos"> <area href="detalhe.php?id=200&gr=desh" alt="Desenvolvimento Humano" title="Desenvolvimento Humano" shape="poly" coords="176, 351, 258, 300, 345, 345, 348, 448, 262, 498, 184, 442" style="outline:none;" target="_self" onmouseover="if(document.images) document.getElementById('map-image').src= 'images/cdes.png';" onmouseout="if(document.images) document.getElementById('map-image').src= 'images/colmeia.png';" /> <area href="detalhe.php?id=200&gr=info" alt="Informática" title="Informática" shape="poly" coords="431, 199, 517, 149, 599, 199, 598, 306, 514, 350, 431, 301" style="outline:none;" target="_self" onmouseover="if(document.images) document.getElementById('map-image').src= 'images/cinf.png';" onmouseout="if(document.images) document.getElementById('map-image').src= 'images/colmeia.png';" /> <area href="detalhe.php?id=200&gr=gestao" alt="Gestão Avançada" title="Gestão Avançada" shape="poly" coords="262, 197, 347, 150, 430, 200, 430, 300, 344, 345, 258, 300" style="outline:none;" target="_self" onmouseover="if(document.images) document.getElementById('map-image').src= 'images/cgest.png';" onmouseout="if(document.images) document.getElementById('map-image').src= 'images/colmeia.png';" /> <area href="detalhe.php?id=200&gr=contabil" alt="Contabilidade e Tributos" title="Contabilidade e Tributos" shape="poly" coords="90, 202, 178, 153, 262, 199, 260, 302, 177, 352, 92, 299" style="outline:none;" target="_self" onmouseover="if(document.images) document.getElementById('map-image').src= 'images/ccont.png';" onmouseout="if(document.images) document.getElementById('map-image').src= 'images/colmeia.png';" /> <area href="detalhe.php?id=200&gr=seguranca" alt="Segurança da Informação" title="Segurança da Informação" shape="poly" coords="345, 54, 428, 0, 515, 54, 516, 150, 430, 201, 345, 151" style="outline:none;" target="_self" onmouseover="if(document.images) document.getElementById('map-image').src= 'images/cseg.png';" onmouseout="if(document.images) document.getElementById('map-image').src= 'images/colmeia.png';" /> <area href="detalhe.php?id=201&gr=sistemas&ant=32" alt="Sistemas de Informação" title="Sistemas de Informação" shape="poly" coords="174, 49, 259, 1, 347, 56, 346, 152, 261, 199, 178, 153" style="outline:none;" target="_self" onmouseover="if(document.images) document.getElementById('map-image').src= 'images/csist.png';" onmouseout="if(document.images) document.getElementById('map-image').src= 'images/colmeia.png';" /> <area href="detalhe.php?id=200&gr=coaching" alt="Coaching" title="Coaching" shape="poly" coords="6, 49, 91, 2, 176, 50, 178, 153, 89, 202, 4, 146" style="outline:none;" target="_self" onmouseover="if(document.images) document.getElementById('map-image').src= 'images/ccoach.png';" onmouseout="if(document.images) document.getElementById('map-image').src= 'images/colmeia.png';" /> </map> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/image-map-resizer/1.0.10/js/imageMapResizer.js"></script> <script>$(document).ready(function(e){$("map").imageMapResize();});</script> </div>  
    • By TaisStream
      Como configurar essa query com inner join, no arquivo .xml?
      Me ajudem pf eu comecei mas estou perdida,  pesquisei já vi algo de /root... mas minha query esta diferente, nao sei se falta algo
       
       
      QUERY ATUAL:
      set mapreduce.job.queuename=low_relatorios; 
      set mapreduce.job.max.split.locations=100;
      SELECT a.num_msisdn,
             a.max_date
      FROM fact.dw_f_rcrg_gems_rate_subsc t
      INNER JOIN
        (SELECT num_msisdn,
                MAX(dat_operacao) AS max_date
         FROM fact.dw_f_rcrg_gems_rate_subsc
         WHERE (ref_date)>=$startdate
           AND ref_date<=$finaldate
           AND ide_plano_tarifario_atual IN (48,
                                             50,
                                             51,
                                             52,
                                             53,
                                             59,
                                             61,
                                             62,
                                             63,
                                             67,
                                             73,
                                             74)
         GROUP BY num_msisdn)a ON a.num_msisdn = t.num_msisdn
      AND a.max_date = t.dat_operacao
      WHERE ref_date>=$startdate
      AND ref_date<=$finaldate;
       
      QUERY CONFIGURANDO NO XML: 
       
          <value><![CDATA[[
      INSERT
              overwrite TABLE fact.dw_f_rcrg_gems_rate_subsc t 
              (
                      a.num_msisdn,
                      a.max_date
              )
      (SELECT
          INNER JOIN
      SELECT      
              MAX(dat_operacao) AS max_date;
      FROM fact.dw_f_rcrg_gems_rate_subsc) a
         WHERE (ref_date)>='$startdate'
           AND ref_date<=$'finaldate'
           AND ide_plano_tarifario_atual IN (48,
                                             50,
                                             51,
                                             52,
                                             53,
                                             59,
                                             61,
                                             62,
                                             63,
                                             67,
                                             73,
                                             74)
         GROUP BY num_msisdn)a ON a.num_msisdn = t.num_msisdn
                  AND a.max_date = t.dat_operacao
      WHERE ref_date>='$startdate'
      AND ref_date<=$finaldate;]]>
      </value>
       
       
      Poderiam me ajudar por favor, sou estagiario na area e ainda estou aprendendo.
×

Important Information

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