I am doing my first steps with WordPress_plugins/PHP and just faced my first wall. Will try to do my best in order to explain the problem, please give me some discount.
I am creating a plugin for WordPress website that needs to call an external Rest API server and get the inventory value of a specific product, for this purpose I am using wp_remote_get & wp_remote_retrieve_body. Until this point everything is working fine, the connection is made successfully and I do get the response in XML.
The problem starts when I try to extract the data (value of the quantity in stock) from the XML response. For some reason it is resulting in NULL, I have printed the response just to make sure the data is actually there and indeed it is.
Also, I stored the printed response in to a variable and tried to use the same logic in order to get the value I am looking for and it worked just fine.
Please see my code/comments below, any advice will be much appreciated, thank you:
//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>
As you can see, I am able to get the quantity in stock value when using a manually created response but not when directly from the api response variable.
Question: What am I missing/doing wrong when getting the XML element value directly from the API response variable?
Thank you
---------------------------------------------------------------------
18-03-2020 15:30
Based on Mikhail's suggestion I did some XML error testing, please see below:
I run my script with the below code added to it and the result was "No loading errors found.":
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>";
}
Also, the print result of simplexml_load_string($response_body) is like this:
SimpleXMLElement Object
(
[Inventory] => SimpleXMLElement Object
(
[Product] => TestProduct
[ProductInventories] => SimpleXMLElement Object
(
[ProductInventory] => SimpleXMLElement Object
(
[Site] => 101
[QuantityInStock] => 238.00000
[QuantityHardAllocated] => 0.00000
[QuantitySoftAllocated] => 0.00000
)
)
)
)
I don't really understand what is wrong... Thank you guys in advance for any help.
get_api_response
function returns in fact, check what it returns exactly.