PHP - 将XML转换为数组错过了XML字符串中的一些信息

I am using curl to get an external XML document and convert it to an array.

The code works almost perfect, apart from one node in the XML isn't being processed and put in my array.

Under <drivers> there is a code for each driver: <driver code="TM1"> but this doesn't get picked up by my array as an @attribute array like the others such as <collection date="20160324">

Does anybody know why this is happening?

XML:

<findit xmlns="http://www.URL.COM" version="8" type="TIX" date="20160323">
  <account code="XXXXXX">
    <customers>
      <customer code="12345">
        <status code="0">Success</status>
        <logistic-jobs>
          <logistic-job id="12345" date="20160324" status="PLA" modified="201603231420">
        <number>
          <number1>479599</number1>
          <number3>11221</number3>
        </number>
        <collection date="20160324" time="0500">
          <name>JOHN SMITH</name>
          <address1>UNIT 3 DAVEY ROAD</address1>
          <address2>FIELDS END BUSINESS PARK</address2>
          <address3>GOLDTHORPE</address3>
          <address4>ROTHERHAM</address4>
          <address5>S63 0JF</address5>
        </collection>
        <delivery date="20160324" time="1200">
          <address1>EXAMPLE</address1>
          <address2>GLENEAFLES FARM</address2>
          <address3>GLENEAGLES CLOSE</address3>
          <address4>STANWELL, MIDDLESEX</address4>
          <address5>TW19 7PD</address5>
        </delivery>
        <extra>
          <address1>45FT C/SIDER</address1>
          <address2>No</address2>
          <address4>CEMENT</address4>
        </extra>
        <drivers>
          <driver code="TM1">DAVE SMITH (DAYS)</driver>
        </drivers>
        <load weight="27600.00" volume="0.00">
          <pallets full="23" half="0" quarter="0" blue="0" oversize="0"/>
        </load>
      </logistic-job>
    </logistic-jobs>
  </customer>
</customers>
</account>
</findit>

PHP:

$job_array = json_decode(json_encode(simplexml_load_string($xml)), true);

if(is_array($job_array['account']['customers']['customer'])) {

    // Foreach customer in array
    foreach($job_array['account']['customers']['customer'] as $i => $customer) {

        // If status is set to success
        if($customer['status'] == "Success") {

            // For each job
            foreach($customer['logistic-jobs']['logistic-job'] as $i => $job) {

                echo '<pre>'; print_r($job); echo '</pre>';

            }

        }

    }

}

OUTPUT:

Array
(
[@attributes] => Array
    (
        [id] => 12345
        [date] => 20160324
        [status] => PLA
        [modified] => 201603231420
    )

[number] => Array
    (
        [number1] => 479599
        [number3] => 11221
    )

[collection] => Array
    (
        [@attributes] => Array
            (
                [date] => 20160324
                [time] => 0500
            )

        [name] => JOHN SMITH
        [address1] => UNIT 3 DAVEY ROAD
        [address2] => FIELDS END BUSINESS PARK
        [address3] => GOLDTHORPE
        [address4] => ROTHERHAM
        [address5] => S63 0JF
    )

[delivery] => Array
    (
        [@attributes] => Array
            (
                [date] => 20160324
                [time] => 1200
            )

        [address1] => EXAMPLE
        [address2] => GLENEAFLES FARM
        [address3] => GLENEAGLES CLOSE
        [address4] => STANWELL, MIDDLESEX
        [address5] = TW19 7PD
    )

[extra] => Array
    (
        [address1] => 45FT C/SIDER
        [address2] => No
        [address4] => CEMENT
    )

[drivers] => Array
    (
        [driver] => DAVE SMITH (DAYS)
    )

[load] => Array
    (
        [@attributes] => Array
            (
                [weight] => 21509.00
                [volume] => 0.00
            )

        [pallets] => Array
            (
                [@attributes] => Array
                    (
                        [full] => 52
                        [half] => 0
                        [quarter] => 0
                        [blue] => 0
                        [oversize] => 0
                    )

            )

    )

)
duangou1868
duangou1868 感谢您的回复@xmike,但我已经尝试了这个,它仍然没有给我我需要的'代码'。
4 年多之前 回复
doulu1867
doulu1867 我认为这会有所帮助
4 年多之前 回复

1个回答



我有一个简单的答案:不要将XML转换为数组</ strong>。 SimpleXML有一个非常有用的API,用于遍历XML文档并查找所需的数据; 丢掉可怕的 json_decode(json_encode(</ code> hack,看看示例。</ p>

在这种情况下, echo $ driver </ code>会给你内容(驱动程序名称)和 echo $ driver ['code'] </ code>会给你属性值;很明显,一个普通的数组不能有那么方便的魔法,这就是为什么转换为一个就会给你带来麻烦。</ p>

请记住, print_r </ code>也会隐藏您的内容,您可能需要专用调试功能。</ p>

以下是一个示例(使用现场演示< / a>)获取每个驱动程序的代码和名称:</ p>

  $ job_simple = simplexml_load_string($ xml); 

if(isset($ job_simple-&gt; account) - &gt; customers-&gt; customer)){

//来自阵列的Foreach客户
foreach($ job_simple-&gt; account-&gt; customers-&gt; customer as $ i =&gt; $ customer){

//如果状态设置为成功
如果((字符串)$ customer-&gt; status ==“成功”){

//对于每个作业
foreach($ customer-&gt; {'logistic-jobs'} - &gt; {'logistic-job'} as $ i =&gt; $ job){
echo“&lt; ul&gt;
”;
foreach($ job- &gt; drivers-&gt;驱动程序为$ driver){
echo“&lt; li&gt; {$ driver ['code']}:$ driver
”;
}
echo“&lt; / ul&gt;
“;
}
}
}
}
</ code> </ pre>
</ div>

展开原文

原文

I have a simple answer for you: don't convert XML to an array. SimpleXML has a really useful API for traversing through the XML document and finding the data you want; throw away the horrible json_decode(json_encode( hack and look at the examples in the PHP manual.

In this case, echo $driver would give you the contents (driver name) and echo $driver['code'] would give you the attribute value; clearly, a plain array can't have that convenient magic, which is why converting to one is giving you problems.

Just remember that print_r will also hide things from you, and you might want a dedicated debugging function.

Here's an example (with live demo) of getting the code and name of each driver:

$job_simple = simplexml_load_string($xml);

if(isset($job_simple->account->customers->customer)) {

    // Foreach customer in array
    foreach($job_simple->account->customers->customer as $i => $customer) {

        // If status is set to success
        if((string)$customer->status == "Success") {

            // For each job
            foreach($customer->{'logistic-jobs'}->{'logistic-job'} as $i => $job) {
                echo "<ul>
";
                foreach ( $job->drivers->driver as $driver ) {
                     echo "<li> {$driver['code']}: $driver
";
                }
                echo "</ul>
";
            }
        }
    }
}

dongyikong6207
dongyikong6207 工作得很完美,非常感谢你的帮助!
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐