1

I've that xml structure retrieving from device

<packet>
    <info action="fiscalmemory" fiscalmemorysize="1048576" recordsize="464" fiscal="1" uniqueno="ABC12345678" nip="123-456-78-90" maxrecordscount="2144" recordscount="7" maxreportscount="1830" reportscount="4" resetmaxcount="200" resetcount="0" taxratesprglimit="30" taxratesprg="1" currencychangeprglimit="4" currencychangeprg="0" fiscalstartdate="dd-mm-yyyy hh:dd:ss" fiscalstopdate="dd-mm-yyyy hh:dd:ss" currencyname="PLN" />
    <ptu name="A" bres="Nobi">123.23</ptu>
    <ptu name="B">123.23</ptu>
    <ptu name="D">8</ptu>
    <sale>999.23</sale>
</packet>

simpleXml does't see ptu's attributes

$array = simplexml_load_string($xml);
print_r($array);

It prints

SimpleXMLElement Object
(
    [info] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [action] => fiscalmemory
                    [fiscalmemorysize] => 1048576
                    [recordsize] => 464
                    [fiscal] => 1
                    [uniqueno] => ABC12345678
                    [nip] => 123-456-78-90
                    [maxrecordscount] => 2144
                    [recordscount] => 7
                    [maxreportscount] => 1830
                    [reportscount] => 4
                    [resetmaxcount] => 200
                    [resetcount] => 0
                    [taxratesprglimit] => 30
                    [taxratesprg] => 1
                    [currencychangeprglimit] => 4
                    [currencychangeprg] => 0
                    [fiscalstartdate] => dd-mm-yyyy hh:dd:ss
                    [fiscalstopdate] => dd-mm-yyyy hh:dd:ss
                    [currencyname] => PLN
                )

        )

    [ptu] => Array
        (
            [0] => 123.23
            [1] => 123.23
            [2] => 8
        )

    [sale] => 999.23
)

As we can see ptu doesn't contain attributes :/

I also tried parse it with recursive function because children also may contain chilren but without success :/

Could anybody point to me why SimpleXML doesn't take ptu's attributes and also share any parsing function?

Thanks in advance.

edited

As regards Nigel Ren I made that function

function parseXMLtoArray($xml){
    $x = simplexml_load_string($xml);
    $result = [];

    function parse($xml, &$res){
        $res['name'] = $xml->getName();
        $res['value'] = $xml->__toString();
        foreach ($xml->attributes() as $k => $v){
            $res['attr'][$k] = $v->__toString();
        }

        foreach($xml->children() as $child){
            parse($child, $res['children'][]);
        }
    }

    parse($x, $result);

    return $result;

}

$resArray = parseXMLtoArray($rawXml);

print_r($resArray);

this returns such array

Array
(
    [name] => packet
    [value] => 

    [attr] => Array
        (
            [crc] => BKJFKHKD54
        )

    [children] => Array
        (
            [0] => Array
                (
                    [name] => info
                    [value] => 
                    [attr] => Array
                        (
                            [action] => fiscalmemory
                            [fiscalmemorysize] => 1048576
                            [recordsize] => 464
                            [fiscal] => 1
                            [uniqueno] => ABC12345678
                            [nip] => 123-456-78-90
                            [maxrecordscount] => 2144
                            [recordscount] => 7
                            [maxreportscount] => 1830
                            [reportscount] => 4
                            [resetmaxcount] => 200
                            [resetcount] => 0
                            [taxratesprglimit] => 30
                            [taxratesprg] => 1
                            [currencychangeprglimit] => 4
                            [currencychangeprg] => 0
                            [fiscalstartdate] => dd-mm-yyyy hh:dd:ss
                            [fiscalstopdate] => dd-mm-yyyy hh:dd:ss
                            [currencyname] => PLN
                        )

                )

            [1] => Array
                (
                    [name] => ptu
                    [value] => 123.23
                    [attr] => Array
                        (
                            [name] => A
                        )

                )

            [2] => Array
                (
                    [name] => ptu
                    [value] => 123.23
                    [attr] => Array
                        (
                            [name] => B
                        )

                )

            [3] => Array
                (
                    [name] => ptu
                    [value] => 8
                    [attr] => Array
                        (
                            [name] => D
                        )

                )

            [4] => Array
                (
                    [name] => sale
                    [value] => 999.23
                )

        )

)

Is this correct?

Thanks again Nigel

1
  • If the array is in the format your after, then it will do the job. Commented Mar 29, 2018 at 17:46

1 Answer 1

1

When loading with SimpleXML, using print_r() gives only an idea of the content and doesn't have the full content. If you want to see the full content then use ->asXML()...

$array = simplexml_load_string($xml);
echo $array->asXML();

To check the attributes of <ptu> element, (this just gives the first one)...

echo $array->ptu[0]['name'];

This uses ->ptu to get the <ptu> element and takes the first one [0] and then takes the name attribute using ['name'].

Sign up to request clarification or add additional context in comments.

1 Comment

Thank You very much, this exlplained to me a lot, especially ->asXML()

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.