SimpleXML不使用来自外部API的XML响应

时间:2020-03-17 作者:Petru

我正在使用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 -&gt; 
//<br>Quantity_in_stock_xml_manual -&gt; 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
                        )

                )

        )

)
我真的不明白怎么了。。。提前感谢你们的帮助。

1 个回复
最合适的回答,由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.

如果要深入挖掘,函数名不区分大小写,但永远不要依赖它!忘记它,永远不要不尊重函数的名称大小写!

只要接受这样一条规则,即无论您键入什么代码,无论是变量还是函数,都要将所有内容视为区分大小写的,并且可能会有好的代码:)

相关推荐

生成元素的PHP代码在哪里?

当我对网站上某些元素的CSS/HTML/JS感兴趣时,我会预览它并在浏览器devtools中测试修改。我在这里很清楚。在PHP中是如何实现的?我在WordPress上有一个页面,我对一些元素感兴趣。我想知道生成这个元素的PHP代码在哪里。然后我想修改此代码并查看更改。最聪明的方法是什么?我知道我需要设计->主题编辑器中的文件。我也使用儿童主题。我在函数中实现了一些JS脚本。php。现在我感兴趣的是,例如,在主收藏和单个帖子中包含作者信息的元素。或者另一个问题:在编辑文章时,我们有“作者”字段。另一种