将 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 工作原理的误解以及调试输出中的一个怪癖,它经常被误用。
在此被标记为重复之前,请注意我的问题与正常的 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 工作原理的误解以及调试输出中的一个怪癖,它经常被误用。