Как получить данные из XML и преобразовать в массив для конкретного узла в PHP? - PullRequest
0 голосов
/ 08 октября 2018

У меня проблема с получением данных с определенного узла.Вот мой xml, сохраненный в одной переменной.

<?xml version="1.0" encoding="UTF-8"?>
<soap-env:Envelope xmlns:soap-env="http://some-url/soap/envelope/">
<soap-env:Header />
<soap-env:Body>
    <n0:ZTRF_DATA_RFCResponse xmlns:n0="urn:sap-com:document:sap:rfc:functions">
        <MESSAGE />
        <MSGTYP />
        <RETVAL>[{"matkl":"BIGFCYDIV","zprod":"BIG","ztyp":"FCY","zmod":"DIV","zprodt":"GANG","ztypt":"FANCY","zmodt":"DIVA","descr":"BICYCLE FCY DIVA"},{"matkl":"BIGFCYDLX","zprod":"BIG","ztyp":"FCY","zmod":"DLX","zprodt":"GANG","ztypt":"FANCY","zmodt":"DLX","descr":"BICYCLE FCY DELUX"},{"matkl":"BIGFCYECO","zprod":"BIG","ztyp":"FCY","zmod":"ECO","zprodt":"GANG","ztypt":"FANCY","zmodt":"ECO","descr":"BICYCLE FCY ECO"},{"matkl":"BIGFCYELT","zprod":"BIG","ztyp":"FCY","zmod":"ELT","zprodt":"GANG","ztypt":"FANCY","zmodt":"ELT","descr":"BICYCLE FCY ELITE"},{"matkl":"BIGFCYEXX","zprod":"BIG","ztyp":"FCY","zmod":"EXX","zprodt":"GANG","ztypt":"FANCY","zmodt":"EXX","descr":"BICYCLE FCY EX"},{"matkl":"BIGFCYNXT","zprod":"BIG","ztyp":"FCY","zmod":"NXT","zprodt":"GANG","ztypt":"FANCY","zmodt":"NXT","descr":"BICYCLE FCY NXT"},{"matkl":"BIGFCYORD","zprod":"BIG","ztyp":"FCY","zmod":"ORD","zprodt":"GANG","ztypt":"FANCY","zmodt":"ORD-FCY","descr":"BICYCLE FCY ORD"},{"matkl":"BIGFCYPRE","zprod":"BIG","ztyp":"FCY","zmod":"PRE","zprodt":"GANG","ztypt":"FANCY","zmodt":"PRE","descr":"BICYCLE FCY PREMIUM"},{"matkl":"BIGFCYSPD","zprod":"BIG","ztyp":"FCY","zmod":"SPD","zprodt":"GANG","ztypt":"FANCY","zmodt":"SPD","descr":"BICYCLE FCY SPEED"},{"matkl":"BIGFCYVXX","zprod":"BIG","ztyp":"FCY","zmod":"VXX","zprodt":"GANG","ztypt":"FANCY","zmodt":"VX1","descr":"BICYCLE FCY VX1"},{"matkl":"BIGFCYZXX","zprod":"BIG","ztyp":"FCY","zmod":"ZXX","zprodt":"GANG","ztypt":"FANCY","zmodt":"ZXX","descr":"BICYCLE FCY ZX"},{"matkl":"BIGKIDJNR","zprod":"BIG","ztyp":"KID","zmod":"JNR","zprodt":"GANG","ztypt":"KIDS","zmodt":"JNR","descr":"BICYCLE KID JUNIOR"},{"matkl":"BIGTNDFCY","zprod":"BIG","ztyp":"TND","zmod":"FCY","zprodt":"GANG","ztypt":"TENDER","zmodt":"FANCY","descr":"Tender - Fancy"},{"matkl":"BIHFCYHDT","zprod":"BIH","ztyp":"FCY","zmod":"HDT","zprodt":"HUGE","ztypt":"FANCY","zmodt":"HDT","descr":"BICYCLE HUGE HDT"},{"matkl":"BIHFCYHYB","zprod":"BIH","ztyp":"FCY","zmod":"HYB","zprodt":"HUGE","ztypt":"FANCY","zmodt":"HYB","descr":"BICYCLE HUGE HYB"},{"matkl":"BIHFCYLDY","zprod":"BIH","ztyp":"FCY","zmod":"LDY","zprodt":"HUGE","ztypt":"FANCY","zmodt":"LADY","descr":"BICYCLE HUGE LADY"},{"matkl":"BIHFCYSHK","zprod":"BIH","ztyp":"FCY","zmod":"SHK","zprodt":"HUGE","ztypt":"FANCY","zmodt":"SHK","descr":"BICYCLE HUGE SHK"},{"matkl":"BIHKIDJNR","zprod":"BIH","ztyp":"KID","zmod":"JNR","zprodt":"HUGE","ztypt":"KIDS","zmodt":"JNR","descr":"BICYCLE HUGE KID"},{"matkl":"BIKSTDDXX","zprod":"BIK","ztyp":"STD","zmod":"DXX","zprodt":"SKB","ztypt":"STANDARD","zmodt":"DXX","descr":"BICYCLE STD DX"},{"matkl":"BIKSTDORD","zprod":"BIK","ztyp":"STD","zmod":"OR1","zprodt":"SKB","ztypt":"STANDARD","zmodt":"ORD-STD","descr":"BICYCLE STD ORD"},{"matkl":"BIKSTDPXT","zprod":"BIK","ztyp":"STD","zmod":"PXT","zprodt":"SKB","ztypt":"STANDARD","zmodt":"PXT","descr":"BICYCLE STD PXT"},{"matkl":"BIKTN1STD","zprod":"BIK","ztyp":"TN1","zmod":"STD","zprodt":"SKB","ztypt":"TENDER-2","zmodt":"STANDARD","descr":"Tender-2"},{"matkl":"BIKTNDSTD","zprod":"BIK","ztyp":"TND","zmod":"STD","zprodt":"SKB","ztypt":"TENDER-1","zmodt":"STANDARD","descr":"Tender-1"},{"matkl":"BISFCYORD","zprod":"BIS","ztyp":"FCY","zmod":"ORD","zprodt":"SMART","ztypt":"FANCY","zmodt":"SMART-ORD","descr":"BICYCLE FCY ORD"},{"matkl":"BISKIDJNR","zprod":"BIS","ztyp":"KID","zmod":"JNR","zprodt":"SMART","ztypt":"KIDS","zmodt":"JNR","descr":"BICYCLE KID JUNIOR"},{"matkl":"BISSTDORD","zprod":"BIS","ztyp":"STD","zmod":"ORD","zprodt":"SMART","ztypt":"STANDARD","zmodt":"ORD","descr":"BICYCLE STD ORD"}]</RETVAL>
    </n0:ZTRF_DATA_RFCResponse>
  </soap-env:Body>
</soap-env:Envelope>

Выше данные сохраняются в одной переменной: -

$xml = simplexml_load_string($xmlstring, "SimpleXMLElement", LIBXML_NOCDATA);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
echo "<pre>"; print_r($array); die;

Существует узел RETVAL, я хочу получить все данные json из этого узлаи преобразовать в массив.Я пробовал приведенный выше код, но не работает.Может кто-нибудь помочь мне, как решить эту проблему, спасибо заранее.

1 Ответ

0 голосов
/ 09 октября 2018

Вам необходимо получить значение узла, который содержит вашу строку JSON.Я бы использовал DOMDocument и DOMXPath , чтобы сделать это:

<?php

$xmlString = <<<END
<?xml version="1.0" encoding="UTF-8"?>
<soap-env:Envelope xmlns:soap-env="http://some-url/soap/envelope/">
<soap-env:Header />
<soap-env:Body>
    <n0:ZTRF_DATA_RFCResponse xmlns:n0="urn:sap-com:document:sap:rfc:functions">
        <MESSAGE />
        <MSGTYP />
        <RETVAL>[{"matkl":"BIGFCYDIV","zprod":"BIG","ztyp":"FCY","zmod":"DIV","zprodt":"GANG","ztypt":"FANCY","zmodt":"DIVA","descr":"BICYCLE FCY DIVA"},{"matkl":"BIGFCYDLX","zprod":"BIG","ztyp":"FCY","zmod":"DLX","zprodt":"GANG","ztypt":"FANCY","zmodt":"DLX","descr":"BICYCLE FCY DELUX"},{"matkl":"BIGFCYECO","zprod":"BIG","ztyp":"FCY","zmod":"ECO","zprodt":"GANG","ztypt":"FANCY","zmodt":"ECO","descr":"BICYCLE FCY ECO"},{"matkl":"BIGFCYELT","zprod":"BIG","ztyp":"FCY","zmod":"ELT","zprodt":"GANG","ztypt":"FANCY","zmodt":"ELT","descr":"BICYCLE FCY ELITE"},{"matkl":"BIGFCYEXX","zprod":"BIG","ztyp":"FCY","zmod":"EXX","zprodt":"GANG","ztypt":"FANCY","zmodt":"EXX","descr":"BICYCLE FCY EX"},{"matkl":"BIGFCYNXT","zprod":"BIG","ztyp":"FCY","zmod":"NXT","zprodt":"GANG","ztypt":"FANCY","zmodt":"NXT","descr":"BICYCLE FCY NXT"},{"matkl":"BIGFCYORD","zprod":"BIG","ztyp":"FCY","zmod":"ORD","zprodt":"GANG","ztypt":"FANCY","zmodt":"ORD-FCY","descr":"BICYCLE FCY ORD"},{"matkl":"BIGFCYPRE","zprod":"BIG","ztyp":"FCY","zmod":"PRE","zprodt":"GANG","ztypt":"FANCY","zmodt":"PRE","descr":"BICYCLE FCY PREMIUM"},{"matkl":"BIGFCYSPD","zprod":"BIG","ztyp":"FCY","zmod":"SPD","zprodt":"GANG","ztypt":"FANCY","zmodt":"SPD","descr":"BICYCLE FCY SPEED"},{"matkl":"BIGFCYVXX","zprod":"BIG","ztyp":"FCY","zmod":"VXX","zprodt":"GANG","ztypt":"FANCY","zmodt":"VX1","descr":"BICYCLE FCY VX1"},{"matkl":"BIGFCYZXX","zprod":"BIG","ztyp":"FCY","zmod":"ZXX","zprodt":"GANG","ztypt":"FANCY","zmodt":"ZXX","descr":"BICYCLE FCY ZX"},{"matkl":"BIGKIDJNR","zprod":"BIG","ztyp":"KID","zmod":"JNR","zprodt":"GANG","ztypt":"KIDS","zmodt":"JNR","descr":"BICYCLE KID JUNIOR"},{"matkl":"BIGTNDFCY","zprod":"BIG","ztyp":"TND","zmod":"FCY","zprodt":"GANG","ztypt":"TENDER","zmodt":"FANCY","descr":"Tender - Fancy"},{"matkl":"BIHFCYHDT","zprod":"BIH","ztyp":"FCY","zmod":"HDT","zprodt":"HUGE","ztypt":"FANCY","zmodt":"HDT","descr":"BICYCLE HUGE HDT"},{"matkl":"BIHFCYHYB","zprod":"BIH","ztyp":"FCY","zmod":"HYB","zprodt":"HUGE","ztypt":"FANCY","zmodt":"HYB","descr":"BICYCLE HUGE HYB"},{"matkl":"BIHFCYLDY","zprod":"BIH","ztyp":"FCY","zmod":"LDY","zprodt":"HUGE","ztypt":"FANCY","zmodt":"LADY","descr":"BICYCLE HUGE LADY"},{"matkl":"BIHFCYSHK","zprod":"BIH","ztyp":"FCY","zmod":"SHK","zprodt":"HUGE","ztypt":"FANCY","zmodt":"SHK","descr":"BICYCLE HUGE SHK"},{"matkl":"BIHKIDJNR","zprod":"BIH","ztyp":"KID","zmod":"JNR","zprodt":"HUGE","ztypt":"KIDS","zmodt":"JNR","descr":"BICYCLE HUGE KID"},{"matkl":"BIKSTDDXX","zprod":"BIK","ztyp":"STD","zmod":"DXX","zprodt":"SKB","ztypt":"STANDARD","zmodt":"DXX","descr":"BICYCLE STD DX"},{"matkl":"BIKSTDORD","zprod":"BIK","ztyp":"STD","zmod":"OR1","zprodt":"SKB","ztypt":"STANDARD","zmodt":"ORD-STD","descr":"BICYCLE STD ORD"},{"matkl":"BIKSTDPXT","zprod":"BIK","ztyp":"STD","zmod":"PXT","zprodt":"SKB","ztypt":"STANDARD","zmodt":"PXT","descr":"BICYCLE STD PXT"},{"matkl":"BIKTN1STD","zprod":"BIK","ztyp":"TN1","zmod":"STD","zprodt":"SKB","ztypt":"TENDER-2","zmodt":"STANDARD","descr":"Tender-2"},{"matkl":"BIKTNDSTD","zprod":"BIK","ztyp":"TND","zmod":"STD","zprodt":"SKB","ztypt":"TENDER-1","zmodt":"STANDARD","descr":"Tender-1"},{"matkl":"BISFCYORD","zprod":"BIS","ztyp":"FCY","zmod":"ORD","zprodt":"SMART","ztypt":"FANCY","zmodt":"SMART-ORD","descr":"BICYCLE FCY ORD"},{"matkl":"BISKIDJNR","zprod":"BIS","ztyp":"KID","zmod":"JNR","zprodt":"SMART","ztypt":"KIDS","zmodt":"JNR","descr":"BICYCLE KID JUNIOR"},{"matkl":"BISSTDORD","zprod":"BIS","ztyp":"STD","zmod":"ORD","zprodt":"SMART","ztypt":"STANDARD","zmodt":"ORD","descr":"BICYCLE STD ORD"}]</RETVAL>
    </n0:ZTRF_DATA_RFCResponse>
  </soap-env:Body>
</soap-env:Envelope>
END;


//Create a new DOMDocument instance and load your XML string 
$dom = new DOMDocument();
$dom->loadXML($xmlString);

//Create a new DOMXPath instance and query for your node
$xpath = new DOMXPath($dom);
$result = $xpath->query('//RETVAL');

//If you have a hit...
if(!empty($result))
{
    //...your JSON will be the nodeValue, you can json_decode it
    $json = $result[0]->nodeValue;
    $array = json_decode($json,true);

    //If the JSON was valid, and is an array, as you expect, go do something with it
    if(is_array($array))
    {
        echo "<pre>"; print_r($array); die;
    }
}
...