Simple XML Reader does not work correctly

3

I have used SimpleXMLReader

to attempt to extract data from the following XML structure:

 <boutique>
       <produto num="228122907">
            <id_produto><![CDATA[70427038]]></id_produto>
            <nome><![CDATA[Solução Antirrugas - Kit]]></nome>
            <descricao><![CDATA[A melhor combinação do Pegolift com Vitamina C elevada ao extremo e as pluri funções do Pluri-Active. Experimente estes agentes.]]></descricao>
       </produto>
</boutique>

But I'm only being able to display the value of the "num" node only, getting this result:

/boutique/produto: 228122907 = 0;
/boutique/produto: 285823820 = 0;
/boutique/produto: 285823824 = 0;
/boutique/produto: 285823825 = 0;
/boutique/produto: 285823826 = 0;
/boutique/produto: 285823827 = 0;

No matter what I change, I can not, for example, extract the value of the <nome> nodule. I'm using this software because I'm dealing with a very large XML file.

Download the XML file here: http://v2.afilio.com.br/aff/aff_get_boutique.php?boutiqueid=37930-895987&token=53e355b0a09ea0.74300807&progid=1010&format=XML

Download the SimpleXMLReader software here: https://github.com/dkrnl/SimpleXMLReader

My code is as follows:

<?php
header ("Content-type: text/html, charset=utf-8;");
require_once dirname(__FILE__). "/simplexmlreader.php";
class ExampleXmlReader1 extends SimpleXMLReader
{
    public function __construct()
    {
        // by node name

        $this->registerCallback("nome", array($this, "callbackPrice"));
        // by xpath<br />
///////////////////// Nesta parte não mexe
        $this->registerCallback("/boutique/produto", array($this, "callbackRest"));
    }
    protected function callbackPrice($reader)
    {
        $xml = $reader->expandSimpleXml();
        $attributes = $xml->attributes();
        $ref = (string) $attributes->{"num"};
        if ($ref) {
            $price = floatval((string)$xml);
            $xpath = $this->currentXpath();
            echo "$xpath: $ref = $price;\n";
        }
        return true;
    }
    protected function callbackRest($reader)
    {
        $xml = $reader->expandSimpleXml();
        $attributes = $xml->attributes();
        $ref = (string) $attributes->{"num"};
        if ($ref) {
            $rest = floatval((string) $xml);
            $xpath = $this->currentXpath();
            echo "$xpath: $ref = $rest;\n";
        }
        return true;
    }
}
echo "<pre>";
$file = dirname(__FILE__) . "/boutique.xml";
$reader = new ExampleXmlReader1;
$reader->open($file);
$reader->parse();
$reader->close();
    
asked by anonymous 28.05.2017 / 21:34

2 answers

4

From what I understood the first callback is to search by the name of the node and the second callback by the path of the node, as you want the value of the nodes "name", then it would look like this:

<?php
header ("Content-type: text/html, charset=utf-8;");
require_once dirname(__FILE__). "/simplexmlreader.php";
class ExampleXmlReader1 extends SimpleXMLReader
{
    public function __construct()
    {
        // by node name
        $this->registerCallback("nome", array($this, "callbackPrice"));

    }
    protected function callbackPrice($reader)
    {
        $xml = $reader->expandSimpleXml();
        $name = $xml;
        $xpath = $this->currentXpath();
        echo "$xpath: Nome = $name;\n";
        return true;
    }
}
echo "<pre>";
$file = dirname(__FILE__) . "/boutique.xml";
$reader = new ExampleXmlReader1;
$reader->open($file);
$reader->parse();
$reader->close();
    
31.05.2017 / 20:22
2

A very simple solution that returns your XML as an array in PHP:

<?php

$xml = '<boutique><produto num="228122907"><id_produto><![CDATA[70427038]]></id_produto><nome><![CDATA[Solução Antirrugas - Kit]]></nome><descricao><![CDATA[A melhor combinação do Pegolift com Vitamina C elevada ao extremo e as pluri funções do Pluri-Active. Experimente estes agentes.]]></descricao></produto></boutique>';
$xml_file_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA),true), true);

print_r($xml_file_data);

Return of code execution:

    
31.05.2017 / 20:19