Skip to main content
deleted 24 characters in body
Source Link
Petru
  • 3
  • 1
  • 3
SimpleXMLElement Object
(
    [Inventory] =>=> SimpleXMLElement Object
        (
            [Product] =>=> TestProduct
            [ProductInventories] =>=> SimpleXMLElement Object
                (
                    [ProductInventory] =>=> SimpleXMLElement Object
                        (
                            [Site] =>=> 101
                            [QuantityInStock] =>=> 238.00000
                            [QuantityHardAllocated] =>=> 0.00000
                            [QuantitySoftAllocated] =>=> 0.00000
                        )

                )

        )

)
SimpleXMLElement Object
(
    [Inventory] => SimpleXMLElement Object
        (
            [Product] => TestProduct
            [ProductInventories] => SimpleXMLElement Object
                (
                    [ProductInventory] => SimpleXMLElement Object
                        (
                            [Site] => 101
                            [QuantityInStock] => 238.00000
                            [QuantityHardAllocated] => 0.00000
                            [QuantitySoftAllocated] => 0.00000
                        )

                )

        )

)
SimpleXMLElement Object
(
    [Inventory] => SimpleXMLElement Object
        (
            [Product] => TestProduct
            [ProductInventories] => SimpleXMLElement Object
                (
                    [ProductInventory] => SimpleXMLElement Object
                        (
                            [Site] => 101
                            [QuantityInStock] => 238.00000
                            [QuantityHardAllocated] => 0.00000
                            [QuantitySoftAllocated] => 0.00000
                        )

                )

        )

)
added 1557 characters in body
Source Link
Petru
  • 3
  • 1
  • 3


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] =&gt; SimpleXMLElement Object
        (
            [Product] =&gt; TestProduct
            [ProductInventories] =&gt; SimpleXMLElement Object
                (
                    [ProductInventory] =&gt; SimpleXMLElement Object
                        (
                            [Site] =&gt; 101
                            [QuantityInStock] =&gt; 238.00000
                            [QuantityHardAllocated] =&gt; 0.00000
                            [QuantitySoftAllocated] =&gt; 0.00000
                        )

                )

        )

)

I don't really understand what is wrong... Thank you guys in advance for any help.



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] =&gt; SimpleXMLElement Object
        (
            [Product] =&gt; TestProduct
            [ProductInventories] =&gt; SimpleXMLElement Object
                (
                    [ProductInventory] =&gt; SimpleXMLElement Object
                        (
                            [Site] =&gt; 101
                            [QuantityInStock] =&gt; 238.00000
                            [QuantityHardAllocated] =&gt; 0.00000
                            [QuantitySoftAllocated] =&gt; 0.00000
                        )

                )

        )

)

I don't really understand what is wrong... Thank you guys in advance for any help.

Source Link
Petru
  • 3
  • 1
  • 3

SimpleXML is not working with xml response from external api

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 -&gt; 
//<br>Quantity_in_stock_xml_manual -&gt; 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