Home > Backend Development > PHP Tutorial > How does php parse such an xml file?

How does php parse such an xml file?

WBOY
Release: 2016-08-04 09:22:20
Original
948 people have browsed it

<code><?xml version="1.0" encoding="utf-8"?>
<Order DeliveryNo="PH00127495JP">
    <Status>
        <State StateDate="2016-06-28 11:37:47" StateMessage="亲,您的包裹已入库完成,祝您海淘愉快!" StateOperator="PH002JP" />
        <State StateDate="2016-06-29 12:32:13" StateMessage="亲,您的包裹已安排极速转运!" StateOperator="PH002JP" />
        <State StateDate="2016-07-02 09:16:58" StateMessage="亲,您的包裹已到达HK分拨中心,等待清关中!" StateOperator="PH005CN" />
        <State StateDate="2016-07-04 09:32:16" StateMessage="亲,您的包裹已清关完毕!" StateOperator="PH006CN" />
    </Status>
</Order>
//以上xml内容如何获取时间等信息,我试了simplexml_load_string函数,解析失败。
--------------------------------------------------------------------------------
还有就是上面是print_r输出的内容,而var_dump输出的是这样的

    D:\WWW\demo\demo\order.php:24:string '&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;Order DeliveryNo=&quot;PH00127495JP&quot;&gt;
    &lt;Status&gt;
        &lt;State StateDate=&quot;2016-06-28 11:37:47&quot; StateMessage=&quot;亲,您的包裹已入库完成,祝您海淘愉快!&quot; StateOperator=&quot;PH002JP&quot; /&gt;
        &lt;State StateDate=&quot;2016-06-29 12:32:13&quot; StateMessage=&quot;亲,您的包裹已安排极速转运!&quot; StateOperator=&quot;PH002JP&quot; /&gt;
        &lt;State Stat'... (length=877)
//simplexml_load_string函数直接报错,说Warning: simplexml_load_string(): Entity: line 1: parser error : Start tag expected, '&lt;' not found in D:\WWW\demo\demo\order.php on line 36
跪求大神赐教!!
---------------------------------------------------------------------------
    这些是php处理的代码。麻烦大神了。
 $delivery = trim($_POST['delivery']);
$t = $_POST['t'];
$encrypt = $_POST['encrypt'];
$Source = trim($delivery.$encrypt.$t);

    $Source = strtoupper(md5($Source));
    //$Source = trim($_POST['Source']);
    //$Source = strtoupper(md5($Source));
    $data['delivery'] = $delivery;
    $data['t'] = $t;
    $data['encrypt'] = $encrypt;
    $data['Source'] = $Source;
    
    $url = 'http://www.ipehua.com/IWendaAPI/IGetDeliveryAPI.ashx';
    //$xml_content = send_post($url,$data);
    
    $curl = curl_init();
    
    curl_setopt_array($curl, Array(
        CURLOPT_URL            => $url,
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_ENCODING       => 'UTF-8',
        CURLOPT_POSTFIELDS     => $data
    ));
    
    $xml_content = curl_exec($curl);
    curl_close($curl);</code>
Copy after login
Copy after login

回复内容:

<code><?xml version="1.0" encoding="utf-8"?>
<Order DeliveryNo="PH00127495JP">
    <Status>
        <State StateDate="2016-06-28 11:37:47" StateMessage="亲,您的包裹已入库完成,祝您海淘愉快!" StateOperator="PH002JP" />
        <State StateDate="2016-06-29 12:32:13" StateMessage="亲,您的包裹已安排极速转运!" StateOperator="PH002JP" />
        <State StateDate="2016-07-02 09:16:58" StateMessage="亲,您的包裹已到达HK分拨中心,等待清关中!" StateOperator="PH005CN" />
        <State StateDate="2016-07-04 09:32:16" StateMessage="亲,您的包裹已清关完毕!" StateOperator="PH006CN" />
    </Status>
</Order>
//以上xml内容如何获取时间等信息,我试了simplexml_load_string函数,解析失败。
--------------------------------------------------------------------------------
还有就是上面是print_r输出的内容,而var_dump输出的是这样的

    D:\WWW\demo\demo\order.php:24:string '&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;Order DeliveryNo=&quot;PH00127495JP&quot;&gt;
    &lt;Status&gt;
        &lt;State StateDate=&quot;2016-06-28 11:37:47&quot; StateMessage=&quot;亲,您的包裹已入库完成,祝您海淘愉快!&quot; StateOperator=&quot;PH002JP&quot; /&gt;
        &lt;State StateDate=&quot;2016-06-29 12:32:13&quot; StateMessage=&quot;亲,您的包裹已安排极速转运!&quot; StateOperator=&quot;PH002JP&quot; /&gt;
        &lt;State Stat'... (length=877)
//simplexml_load_string函数直接报错,说Warning: simplexml_load_string(): Entity: line 1: parser error : Start tag expected, '&lt;' not found in D:\WWW\demo\demo\order.php on line 36
跪求大神赐教!!
---------------------------------------------------------------------------
    这些是php处理的代码。麻烦大神了。
 $delivery = trim($_POST['delivery']);
$t = $_POST['t'];
$encrypt = $_POST['encrypt'];
$Source = trim($delivery.$encrypt.$t);

    $Source = strtoupper(md5($Source));
    //$Source = trim($_POST['Source']);
    //$Source = strtoupper(md5($Source));
    $data['delivery'] = $delivery;
    $data['t'] = $t;
    $data['encrypt'] = $encrypt;
    $data['Source'] = $Source;
    
    $url = 'http://www.ipehua.com/IWendaAPI/IGetDeliveryAPI.ashx';
    //$xml_content = send_post($url,$data);
    
    $curl = curl_init();
    
    curl_setopt_array($curl, Array(
        CURLOPT_URL            => $url,
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_ENCODING       => 'UTF-8',
        CURLOPT_POSTFIELDS     => $data
    ));
    
    $xml_content = curl_exec($curl);
    curl_close($curl);</code>
Copy after login
Copy after login

<code><?php


$xml = '<?xml version="1.0" encoding="utf-8"?>
<Order DeliveryNo="PH00127495JP">
    <Status>
        <State StateDate="2016-06-28 11:37:47" StateMessage="亲,您的包裹已入库完成,祝您海淘愉快!" StateOperator="PH002JP" />
        <State StateDate="2016-06-29 12:32:13" StateMessage="亲,您的包裹已安排极速转运!" StateOperator="PH002JP" />
        <State StateDate="2016-07-02 09:16:58" StateMessage="亲,您的包裹已到达HK分拨中心,等待清关中!" StateOperator="PH005CN" />
        <State StateDate="2016-07-04 09:32:16" StateMessage="亲,您的包裹已清关完毕!" StateOperator="PH006CN" />
    </Status>
</Order>
';

$xml = simplexml_load_string($xml);


$xml = json_decode(json_encode($xml),TRUE);

echo "DeliveryNo=>",$xml['@attributes']['DeliveryNo'],"<br>";

$state = $xml['Status']['State'];

foreach ($state as $key => $value) {
    print_r($value['@attributes']);
    echo "<br>";
}</code>
Copy after login

PHP 5.6.22 通过。

https://3v4l.org/JZ3UP

<code>$xml_string = '<?xml version="1.0" encoding="utf-8"?>
<Order DeliveryNo="PH00127495JP">
    <Status>
        <State StateDate="2016-06-28 11:37:47" StateMessage="亲,您的包裹已入库完成,祝您海淘愉快!" StateOperator="PH002JP" />
        <State StateDate="2016-06-29 12:32:13" StateMessage="亲,您的包裹已安排极速转运!" StateOperator="PH002JP" />
        <State StateDate="2016-07-02 09:16:58" StateMessage="亲,您的包裹已到达HK分拨中心,等待清关中!" StateOperator="PH005CN" />
        <State StateDate="2016-07-04 09:32:16" StateMessage="亲,您的包裹已清关完毕!" StateOperator="PH006CN" />
    </Status>
</Order>';
libxml_disable_entity_loader(true);
$obj = simplexml_load_string($xml_string, 'SimpleXMLElement', LIBXML_NOCDATA);

print_r($obj);

echo $obj->attributes()->DeliveryNo;</code>
Copy after login

PHP处理XML有几种方式,DOM、XMLReader/Writer、XSL,建议你用后两种,DOM相对耗内存。

<code><?php
$a = <<<EOF
<?xml version="1.0" encoding="utf-8"?>
<Order DeliveryNo="PH00127495JP">
    <Status>
        <State StateDate="2016-06-28 11:37:47" StateMessage="亲,您的包裹已入库完成,祝您海淘愉快!" StateOperator="PH002JP" />
        <State StateDate="2016-06-29 12:32:13" StateMessage="亲,您的包裹已安排极速转运!" StateOperator="PH002JP" />
        <State StateDate="2016-07-02 09:16:58" StateMessage="亲,您的包裹已到达HK分拨中心,等待清关中!" StateOperator="PH005CN" />
        <State StateDate="2016-07-04 09:32:16" StateMessage="亲,您的包裹已清关完毕!" StateOperator="PH006CN" />
    </Status>
</Order>
EOF;
$xml = simplexml_load_string($a);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
$states = $array['Status']['State'];
foreach($states as $state) {
    echo $state['@attributes']['StateMessage'],' 操作员:',$state['@attributes']['StateOperator'],',',$state['@attributes']['StateDate'],PHP_EOL;
}
</code>
Copy after login

输出如下:

<code>亲,您的包裹已入库完成,祝您海淘愉快! 操作员:PH002JP,2016-06-28 11:37:47
亲,您的包裹已安排极速转运! 操作员:PH002JP,2016-06-29 12:32:13
亲,您的包裹已到达HK分拨中心,等待清关中! 操作员:PH005CN,2016-07-02 09:16:58
亲,您的包裹已清关完毕! 操作员:PH006CN,2016-07-04 09:32:16</code>
Copy after login
Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template