Search XML values with tag in variable quantity

Asked

Viewed 26 times

0

I am looking for values of an XML, which has the structure below:

<?xml version="1.0" encoding="UTF-8"?>
-
<retorno>
    <status_processamento>3</status_processamento>
    <status>OK</status>
    -
    <nota_fiscal>
        <id>711259213</id>
        <tipo_nota>N</tipo_nota>
        <natureza_operacao>Venda de mercadoria à não contribuinte E-commerce</natureza_operacao>
        <regime_tributario>3</regime_tributario>
        <finalidade>1</finalidade>
        <serie>1</serie>
        <numero>000129</numero>
        <numero_ecommerce>366</numero_ecommerce>
        <data_emissao>03/03/2021</data_emissao>
        <data_saida>03/03/2021</data_saida>
        <hora_saida>10:46</hora_saida>
        +
        <cliente>+
            <endereco_entrega>-
                <itens>-
                    <item>
                        <id_produto>645000833</id_produto>
                        <codigo>7896306612831</codigo>
                        <descricao>Trento Avelã 32g</descricao>
                        <unidade>Un</unidade>
                        <ncm>1905.32.00</ncm>
                        <quantidade>16.00</quantidade>
                        <valor_unitario>1.81</valor_unitario>
                        <valor_total>28.96</valor_total>
                        <cfop>6108</cfop>
                        <natureza>Venda de mercadoria à não contribuinte E-commerce</natureza>
                    </item>
                    -
                    <item>
                        <id_produto>645000958</id_produto>
                        <codigo>7896306612824</codigo>
                        <descricao>Trento Creme 32g</descricao>
                        <unidade>Un</unidade>
                        <ncm>1905.32.00</ncm>
                        <quantidade>16.00</quantidade>
                        <valor_unitario>1.81</valor_unitario>
                        <valor_total>28.96</valor_total>
                        <cfop>6108</cfop>
                        <natureza>Venda de mercadoria à não contribuinte E-commerce</natureza>
                    </item>
                    -
                    <item>
                        <id_produto>645000974</id_produto>
                        <codigo>7896306618420</codigo>
                        <descricao>Trento Massimo Chocolate 30g</descricao>
                        <unidade>Un</unidade>
                        <ncm>1905.32.00</ncm>
                        <quantidade>1.00</quantidade>
                        <valor_unitario>0.01</valor_unitario>
                        <valor_total>0.01</valor_total>
                        <cfop>6108</cfop>
                        <natureza>Venda de mercadoria à não contribuinte E-commerce</natureza>
                    </item>
                    -
                    <item>
                        <id_produto>645000968</id_produto>
                        <codigo>7896306619458</codigo>
                        <descricao>Trento Massimo Branco Com Cookies 30g</descricao>
                        <unidade>Un</unidade>
                        <ncm>1905.32.00</ncm>
                        <quantidade>1.00</quantidade>
                        <valor_unitario>0.01</valor_unitario>
                        <valor_total>0.01</valor_total>
                        <cfop>6108</cfop>
                        <natureza>Venda de mercadoria à não contribuinte E-commerce</natureza>
                    </item>
                    -
                    <item>
                        <id_produto>645000989</id_produto>
                        <codigo>7896306621147</codigo>
                        <descricao>Trento Massimo Dark 30g</descricao>
                        <unidade>Un</unidade>
                        <ncm>1905.32.00</ncm>
                        <quantidade>1.00</quantidade>
                        <valor_unitario>0.01</valor_unitario>
                        <valor_total>0.01</valor_total>
                        <cfop>6108</cfop>
                        <natureza>Venda de mercadoria à não contribuinte E-commerce</natureza>
                    </item>
                </itens>
                <base_icms>81.54</base_icms>
                <valor_icms>9.78</valor_icms>
                <base_icms_st>0.00</base_icms_st>
                <valor_icms_st>0.00</valor_icms_st>
                <valor_servicos>0.00</valor_servicos>
                <valor_produtos>57.95</valor_produtos>
                <valor_frete>23.59</valor_frete>
                <valor_seguro>0.00</valor_seguro>
                <valor_outras>0.00</valor_outras>
                <valor_ipi>0.00</valor_ipi>
                <valor_issqn>0.00</valor_issqn>
                <valor_nota>81.54</valor_nota>
                <valor_desconto>0.00</valor_desconto>
                <valor_faturado>81.54</valor_faturado>
                <frete_por_conta>D</frete_por_conta>
                -
                <transportador>
                    <nome>EMPRESA BRASILEIRA DE CORREIOS E TELEGRAFOS</nome>
                    <cpf_cnpj>34.028.316/8369-29</cpf_cnpj>
                    <ie/>
                    <endereco/>
                    <cidade/>
                    <uf>ES</uf>
                </transportador>
                <placa/>
                <uf_placa/>
                <quantidade_volumes>1</quantidade_volumes>
                <especie_volumes>Cx</especie_volumes>
                <marca_volumes/>
                <numero_volumes/>
                <peso_bruto>1.40</peso_bruto>
                <peso_liquido>1.11</peso_liquido>
                -
                <forma_envio>
                    <id>600363361</id>
                    <descricao>Correios</descricao>
                </forma_envio>
                -
                <forma_frete>
                    <id>658562917</id>
                    <descricao>PAC CONTRATO AG (03298)</descricao>
                </forma_frete>
                <codigo_rastreamento>QD820063704BR</codigo_rastreamento>
                <url_rastreamento>https://www2.correios.com.br/sistemas/rastreamento</url_rastreamento>
                <condicao_pagamento>30</condicao_pagamento>
                <forma_pagamento>credito</forma_pagamento>
                <meio_pagamento/>
                -
                <parcelas>-
                    <parcela>
                        <dias>30</dias>
                        <data>02/04/2021</data>
                        <valor>81.54</valor>
                        <obs/>
                        <forma_pagamento>credito</forma_pagamento>
                        <meio_pagamento/>
                    </parcela>
                </parcelas>
                <id_venda>711044654</id_venda>
                <id_vendedor>0</id_vendedor>
                <nome_vendedor/>
                <situacao>7</situacao>
                <descricao_situacao>Emitida DANFE</descricao_situacao>
                <obs>Nº Pedido: 137 EC 87/2005 - Total ICMS UF Destino: 4,48 - Total FCP: 0,00. Tributos aproximados: R$ 2,44 (Federal) e R$ 4,06 (Estadual). Fonte: IBPT 8F6CA7</obs>
                <chave_acesso>32210389425888001009550010000001291112592136</chave_acesso>
            </nota_fiscal>
        </retorno>

The Customer and Delivery Address tag, for example, I can redeem the data normally with the command below:

$filename = 'link do xml';

$doc = new DOMDocument();
    $doc->load( $filename);
    $records = $doc->getElementsByTagName( "nota_fiscal" );
    
    foreach( $records as $record ) { // NIVEL NF
    
        $xpathPesquisa = new DOMXpath($doc);    
        $nome_cli = $xpathPesquisa->query('cliente/nome', $record)->item(0)->nodeValue;

The problem I’m facing is when I read what’s below the tag Items -> Item, because the tag Item is variable (can have any amount in each NF). With the command below only rescued the first item:

##
## VAI ABRIR O XML SEGUINTE USANDO O ID DE PARAMETRO ##
##
$filename_tax = 'meulink&id='.$id.'&formato=XML';

$doc_tax = new DOMDocument();
$doc_tax->load( $filename_tax);

$records_tax = $doc_tax->getElementsByTagName( "item" );

    foreach( $records_tax as $record_tax ) { // NIVEL ITEM
        ## parse the ID
        $id_produto = $record_tax->getElementsByTagName( "id_produto" );
        $id_produto = $id_produto->item(0)->nodeValue;

    } //FOREACH ITEM

I tried using xPath, but am getting invalid structure error.

  • Post xml as text, it is easier for those who help ;)

  • @Marcosxavier my bad, already put in text

1 answer

0

For beginners in this, like me, follows below the solution, using xpath:

$doc_tax = new DOMDocument();
$doc_tax->load( $filename_tax);

$xpathPesquisa = new DOMXpath($doc_tax);    

#ID PRODUTO
$id_produto  = array();
$produtoNodes = $xpathPesquisa->query('//item/id_produto'); // selects all name element
for($i=0;$i<$produtoNodes->length;$i++) {
 $id_produto[] = $produtoNodes->item($i)->nodeValue;
 echo "ID Produto: ".$id_produto[$i]."<br>";
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.