我正在使用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'];
一如既往,提前谢谢!
答案 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)