我正在使用WordPress\\u插件/PHP完成我的第一步,我刚刚遇到了第一堵墙。我会尽我最大的努力来解释这个问题,请给我一些折扣。
我正在为WordPress网站创建一个插件,该插件需要调用外部Rest API服务器并获取特定产品的库存值,为此,我使用wp\\u remote\\u get&;wp\\u remote\\u retrieve\\u正文。在这之前,一切都正常工作,连接成功,我确实得到了XML响应。
当我试图从XML响应中提取数据(库存量的值)时,问题就出现了。出于某种原因,它会导致NULL,我打印了响应,只是为了确保数据确实存在。
此外,我将打印的响应存储到一个变量中,并尝试使用相同的逻辑来获取我要查找的值,结果很好。
请查看我的代码/评论,如有任何建议,将不胜感激,谢谢:
//The Rest API xml response obtained by wp_remote_get & wp_remote_retrieve_body.
$response_body = get_api_response($api_url, $arguments);
//The xml data for the "$response_body_manual" was obtained by "Copy Outer HTML" when inspecting the printed/echo element of the "$response_body" on the web browser
$response_body_manual =
\'<!--?xml version="1.0" encoding="UTF-8"?-->
<inventories>
<inventory>
<product>TestProduct</product>
<productinventories>
<productinventory>
<site>101</site>
<quantityinstock>238.00000</quantityinstock>
<quantityhardallocated>0.00000</quantityhardallocated>
<quantitysoftallocated>0.00000</quantitysoftallocated>
</productinventory>
</productinventories>
</inventory>
</inventories>\';
//Parse the response
$xml = simplexml_load_string($response_body);
$xml_manual = simplexml_load_string($response_body_manual);
//Get the quantityinstock value
$QtyInStock_xml = $xml->inventory->productinventories->productinventory->quantityinstock;
$QtyInStock_xml_manual = $xml_manual->inventory->productinventories->productinventory->quantityinstock;
//Print out the results
echo "<center><pre>";
print($response_body . "<br>");
print("XML String loaded successfully" . "<br>");
print("Quantity_in_stock_xml -> " . $QtyInStock_xml . "<br>");
print("Quantity_in_stock_xml_manual -> " . $QtyInStock_xml_manual . "<br>");
echo "</center></pre>";
//Result
//
//<pre>
// <!--?xml version="1.0" encoding="UTF-8"?-->
// <inventories>
// <inventory>
// <product>TestProduct</product>
// <productinventories>
// <productinventory>
// <site>101</site>
// <quantityinstock>238.00000</quantityinstock>
// <quantityhardallocated>0.00000</quantityhardallocated>
// <quantitysoftallocated>0.00000</quantitysoftallocated>
// </productinventory>
// </productinventories>
// </inventory>
// </inventories>
//
//<br>XML String loaded successfully
//<br>Quantity_in_stock_xml ->
//<br>Quantity_in_stock_xml_manual -> 238.00000<br></pre>
如您所见,当使用手动创建的响应时,我能够获得库存数量值,但直接从api响应变量中无法获得。
问题:直接从API响应变量获取XML元素值时,我遗漏了什么/做错了什么?
非常感谢。
---------------------------------------------------------------------
2020年3月18日15:30
根据Mikhail的建议,我做了一些XML错误测试,请参见以下内容:
我运行脚本时添加了以下代码,结果是“未发现加载错误”:
libxml_use_internal_errors(true);
$sxe = simplexml_load_string($response_body);
if ($sxe === false) {
echo "Failed loading XML\\n";
foreach(libxml_get_errors() as $error) {
echo "<center><pre>";
echo "\\t", $error->message;
echo "</center></pre>";
}
}
else{
echo "<center><pre>";
echo "No loading errors found.<br>";
print_r($sxe);
echo "</center></pre>";
}
此外,simplexml\\u load\\u string($response\\u body)的打印结果如下:
SimpleXMLElement Object
(
[Inventory] => SimpleXMLElement Object
(
[Product] => TestProduct
[ProductInventories] => SimpleXMLElement Object
(
[ProductInventory] => SimpleXMLElement Object
(
[Site] => 101
[QuantityInStock] => 238.00000
[QuantityHardAllocated] => 0.00000
[QuantitySoftAllocated] => 0.00000
)
)
)
)
我真的不明白怎么了。。。提前感谢你们的帮助。
最合适的回答,由SO网友:Mikhail 整理而成
根据您的输出
SimpleXMLElement Object
(
[Inventory] => SimpleXMLElement Object
(
[Product] => TestProduct
[ProductInventories] => SimpleXMLElement Object
(
[ProductInventory] => SimpleXMLElement Object
(
[Site] => 101
[QuantityInStock] => 238.00000
[QuantityHardAllocated] => 0.00000
[QuantitySoftAllocated] => 0.00000
)
)
)
)
您必须访问从该XML解析的对象中的变量,如下所示:
$QtyInStock_xml = $xml_parsed_obj->Inventory->ProductInventories->ProductInventory->QuantityInStock;
只是因为
XML is case sensitive ! 和
object\'s keys in PHP are case sensitive 也
Overall keep in mind that PHP\'s variables are case sensitive.
如果要深入挖掘,函数名不区分大小写,但永远不要依赖它!忘记它,永远不要不尊重函数的名称大小写!
只要接受这样一条规则,即无论您键入什么代码,无论是变量还是函数,都要将所有内容视为区分大小写的,并且可能会有好的代码:)