PHP-将XML转换为数组会丢失XML字符串中的某些信息

斯科特·鲍尔斯(Scott Bowers)

我正在使用curl获取外部XML文档并将其转换为数组。

该代码几乎完美,除了不处理XML中的一个节点并将其放入我的数组之外。

<drivers>每个驱动程序的下面都有一个代码:<driver code="TM1">但是我的数组并没有像其他其他驱动程序那样将它作为@attribute数组处理。<collection date="20160324">

有人知道为什么会这样吗?

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>';

            }

        }

    }

}

输出:

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
                    )

            )

    )

)
即时通讯

我为您提供了一个简单的答案:不要将XML转换为arraySimpleXML有一个非常有用的API,可以遍历XML文档并查找所需的数据。丢掉可怕的json_decode(json_encode(hack并看PHP手册中的例子

在这种情况下,echo $driver将为您提供内容(驱动程序名称),echo $driver['code']并为您提供属性值;显然,一个简单的数组不能拥有那么方便的魔术,这就是为什么转换为一个数组会给您带来麻烦。

请记住,这print_r也会对您隐藏一些东西,并且您可能需要专用的调试功能

是获取每个驱动程序的代码和名称的示例(带有实时演示):

$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>\n";
                foreach ( $job->drivers->driver as $driver ) {
                     echo "<li> {$driver['code']}: $driver\n";
                }
                echo "</ul>\n";
            }
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用标签将xml转换为字符串php

来自分类Dev

如何将xml字符串格式转换为php数组

来自分类Dev

将JSON字符串转换为php中的数组?

来自分类Dev

PHP XML字符串转换为复杂的PHP类

来自分类Dev

将jQuery数组字符串转换为PHP数组

来自分类Dev

将jQuery数组字符串转换为PHP数组

来自分类Dev

将php字符串转换为数组数组

来自分类Dev

PHP将数组转换为所需的字符串格式

来自分类Dev

PHP将字符串转换为多维数组

来自分类Dev

PHP将字符串数组列表转换为Array

来自分类Dev

PHP:将字符串转换为嵌套数组

来自分类Dev

使用php将字符串转换为数组

来自分类Dev

将数组转换为JSON字符串php

来自分类Dev

PHP将JSON字符串转换为数组

来自分类Dev

将javascript字符串转换为php数组

来自分类Dev

将字符串数组转换为整数php

来自分类Dev

将字符串转换为单个数组,PHP

来自分类Dev

PHP将目录的多维数组转换为字符串

来自分类Dev

PHP将字符串转换为数组

来自分类Dev

将PHP数组转换为字符串?

来自分类Dev

PHP将数组转换为所需的字符串格式

来自分类Dev

PHP:将多维数组转换为字符串

来自分类Dev

PHP将JSON字符串转换为数组

来自分类Dev

PHP将字符串转换为JSON或数组

来自分类Dev

将HTML字符串转换为PHP数组

来自分类Dev

将数组转换为字符串php

来自分类Dev

PHP将字符串数组转换为int

来自分类Dev

PHP 将数组转换为字符串

来自分类Dev

将数组转换为字符串 php