如何从XML获取数据并将其转换为php中特定节点的数组?

时间:2018-10-08 09:21:31

标签: php arrays json xml

我在从特定节点获取数据时遇到问题。这是我的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;

有Node RETVAL我想从该节点获取所有json数据并将其转换为数组。我已经尝试了上面的代码,但是没有用。谁能帮助我解决这个问题,谢谢。。

1 个答案:

答案 0 :(得分:0)

您需要获取包含JSON字符串的节点的值。我会使用DOMDocumentDOMXPath来做到这一点:

<?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;
    }
}