将 XML 转换为数组,然后循环遍历某些对象会导致 'Illegal string offset' 如果只有一个对象

Converting XML to Array, and then looping through some objects results in 'Illegal string offset' if there's only a single object

在此被标记为重复之前,请注意我的问题与正常的 Illegal string offset 问题略有不同。

我有一些 XML 是订单发送通知。我将其转换为 JSON,然后转换为数组。然后我遍历行项目并将它们添加到 MySQL 数据库。

当有多个项目要循环时,这非常有用。当只有 1 项时,它 returns Illegal string offset 错误。

我重写了代码来模拟这里的问题:

echo "SINGLE ITEM: \r\n";
$xmlstring = '<dispatch_notification>' .
        '    <line_items>' .
        '            <sku>N123456789</sku>' .
        '            <barcode></barcode>' .
        '            <quantity>1</quantity>' .
        '    </line_items>' .
        '</dispatch_notification>' .
        '';
processXML($xmlstring);


echo "\r\n\r\nMULTIPLE ITEMS: \r\n";
$xmlstring = '<dispatch_notification>' .
        '    <line_items>' .
        '            <sku>N123456789</sku>' .
        '            <barcode></barcode>' .
        '            <quantity>1</quantity>' .
        '    </line_items>' .
        '    <line_items>' .
        '            <sku>O123456789</sku>' .
        '            <barcode></barcode>' .
        '            <quantity>5</quantity>' .
        '    </line_items>' .
        '</dispatch_notification>' .
        '';
processXML($xmlstring);

function processXML($xmlstring) {
    $xml = simplexml_load_string($xmlstring, "SimpleXMLElement", LIBXML_NOCDATA);
    $dispatchedOrder = json_decode(json_encode($xml), TRUE);
    foreach ($dispatchedOrder['line_items'] as $item) {//loop through each line item
        echo $item['sku'] . ", " . $item['quantity'] . "\r\n";
    }
}

这输出:

SINGLE ITEM: Warning: Illegal string offset 'sku' in /testing/xmltest.php on line 47

Warning: Illegal string offset 'quantity' in /testing/xmltest.php on line 47 N, N , Warning: Illegal string offset 'sku' in /testing/xmltest.php on line 47

Warning: Illegal string offset 'quantity' in /testing/xmltest.php on line 47 1, 1

MULTIPLE ITEMS: N123456789, 1 O123456789, 5

这表明在 line_items 对象有多个而不是单个对象时循环时它工作正常。

我也试过这种格式的XML,但是这个有同样的问题。

<line_items>
    <item>
        <sku>M7389462334</sku>
        <barcode></barcode>
        <quantity>1</quantity>
    </item>
    <item>
        <sku>L67858745445</sku>
        <barcode></barcode>
        <quantity>1</quantity>
    </item>
</line_items>

我有点困惑为什么会这样,我不经常使用 XML,通常是 JSON,所以我不确定这是否与XML 或其他内容的格式。

I have some XML ... I convert to it to JSON and then to an array.

不要那样做。 XML、JSON 和 PHP 数组对于如何以及应该如何构造数据都有不同的想法。盲目地在它们之间转换是一个坏主意。

相反,请查看 usage examples for SimpleXML,看看使用 XML 是多么容易。

这是您的代码的工作版本:

function processXML($xmlstring) {
    $xml = simplexml_load_string($xmlstring);
    foreach ($xml->line_items as $item) {
        echo $item->sku . ", " . $item->quantity . "\r\n";
    }
}

请注意,我也去掉了“LIBXML_NOCDATA”选项 - 由于对 SimpleXML 工作原理的误解以及调试输出中的一个怪癖,它经常被误用。