在相对复杂的XML文件上使用SimpleXML将XML节点转换为PHP变量

时间:2014-01-15 11:08:18

标签: php xml simplexml

我正在使用simplexml_load_string来尝试将我的XML文件转换为变量,我以后可以将其输入到数据库中,但是在某些情况下工作输出很困难而在其他情况下却没有。

xml

$response ='<ndxml version="2.0">
<status code="OK">
<response function="createNewJob" id="1">
    <status code="OK">
    <job uniqueref="5830z858279" jobref="858279">
        <consignment number="8613030">
        <reference>16755</reference>
        <deadlinedatetime date="2014-01-16" time="17:30:00">
        <jobnumber>
        <labeldata styletag="APC">
            <shippingdate date="15/01/2014">
            <addresses>
                <address type="COLLECTION">
                    <company>UK Stuff and Things</company>
                </address>
                <address type="DELIVERY">
                    <contact>Person</contact>
                    <telephone>02089636985</telephone>
                    <addresslines>
                        <addressline number="1">Daffy</addressline>
                        <addressline number="2">Things</addressline>
                        <addressline number="3">Places</addressline>
                        <addressline number="4">NORTHAMPTONSHIRE</addressline>
                    </addresslines>
                    <postzip>NB12 1ER</postzip>
                    <country isocode="GB">United Kingdom</country>
                </address>
            </addresses>
            <notes>
            <account code="21171">
            <tariff code="MP16">
            <routing>
                <delivery>
                    <route>LOCAL</route>
                    <zone>B</zone>
                    <driver>31</driver>
                    <serviceoptions>
                </serviceoptions></delivery>
                <depots>
                    <depot number="211" type="Sending">
                    <depot number="211" type="Request">
                    <depot number="211" type="Delivery">
                </depot></depot></depot></depots>
            </routing>
            <parcels total="1">
                <dimensions height="0" width="0" length="0">
                <volweight>0.0</volweight>
                <weight>0.14</weight>
                <parcel number="1">
                    <barcode>21163148613030001</barcode>
                </parcel>
            </dimensions></parcels>
        </tariff></account></notes></shippingdate></labeldata>
    </jobnumber></deadlinedatetime></consignment></job>
</status>
</response>

    

所以我通过使用文档中推荐的代码成功地从中获取了某些元素:

$parsed=simplexml_load_string($response);
$response_statuscode = $parsed->status['code'];
$response_statuscode2 = $parsed->response->status['code'];
$response_consignment_num = $parsed->response->job->consignment['number'];
$response_reference = $parsed->response->job->reference;

所有这些都完全符合要求,但从那里起,对我来说都有点不对劲。具有更复杂属性(不止一个!)的东西似乎对我不起作用。

 $response_date = $parsed->response->job->deadlinedatetime['date'];

我也尝试过:

 $parsed->response->job->deadlinedatetime->attributes()->date;

从那时起,我似乎无法正确处理标签数据中的任何内容。我只是弄乱了对树的理解?

 $response_account_code = $parsed->response->job->labeldata->account['code'];

一如既往,提前谢谢!

1 个答案:

答案 0 :(得分:1)

处理类似这样的情况有一种非常常见的方法:

由于simplexml_load_string()返回一个对象,并且由于对象属性名称不能包含空格,因此将对象递归转换为数组是有意义的。

您可以使用此功能执行此操作:

function object2array($object) { 
   return json_decode(json_encode($object), true); 
}

$parsed = simplexml_load_string($response);

// Now, recursively convert it into an array
$parsed = object2array($parsed);

// Now you can access its values by keys, like this:
$parsed['response']['job']['labeldata']['account'];

至于转储,您只需执行print_r($parsed)

即可