我有一个XML对象,我需要转换为JSON才能更容易获取值。
XML对象如下:
<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>
<env:Header xmlns:work='http://bea.com/2004/06/soap/workarea/'>
<work:WorkContext xmlns:wsu='http://schemas.xmlsoap.org/ws/2002/07/utility' xmlns:work='http://bea.com/2004/06/soap/workarea/'>
<java class='java.beans.XMLDecoder'>
<string>weblogic.app.MerchantQueryWebService</string>
<int>214</int>
<string>weblogic.workarea.StringWorkContext</string>
<string>2.0</string>
<string/>
</java>
</work:WorkContext>
</env:Header>
<env:Body>
<m:RequestTransactionByTimeIntervalResponse xmlns:m='http://www.zain.com/'>
<m:RequestTransactionByTimeIntervalResult>
<java:Status xmlns:java='java:com.obopay.ws.merchantquery.zain'>0</java:Status>
<java:TotalTransactions xmlns:java='java:com.obopay.ws.merchantquery.zain'>1</java:TotalTransactions>
<java:TotalAmount xmlns:java='java:com.obopay.ws.merchantquery.zain'>50</java:TotalAmount>
<java:Transactions xmlns:java='java:com.obopay.ws.merchantquery.zain'>[46139805#254734977477#50#Test]</java:Transactions>
<java:Message xmlns:java='java:com.obopay.ws.merchantquery.zain'>Success</java:Message>
</m:RequestTransactionByTimeIntervalResult>
</m:RequestTransactionByTimeIntervalResponse>
</env:Body>
</env:Envelope>
我试过了;
$fileContents = str_replace(array("\n", "\r", "\t"), '', $response);
$fileContents = trim(str_replace('"', "'", $fileContents));
$simpleXml = simplexml_load_string($fileContents);
$json = json_encode($simpleXml);
echo $json;
但是,JSON上的响应是{}
没有。
我想获得env:Body
上的值,对此有何建议?
任何
答案 0 :(得分:1)
问题是您有各种名称空间,这使得难以直接访问数据。但是,不要把它转换为JSON,而是值得尝试学习如何使用SimpleXML,它变得更加灵活......
$simpleXml = simplexml_load_string($fileContents);
$simpleXml->registerXPathNamespace("m", "http://www.zain.com/");
$body = $simpleXml->xpath("//m:RequestTransactionByTimeIntervalResult");
$details = $body[0]->children("java", true);
var_dump($details);
echo "Status ".(string)$details->Status.PHP_EOL;
echo "TotalAmount ".(string)$details->TotalAmount.PHP_EOL;
必须注册名称空间允许您使用XPath并找到实际数据的封闭元素,因此->xpath()
行会查找元素<m:RequestTransactionByTimeIntervalResult>
。这将返回一个匹配数据的数组,因此在下一行中,您只需使用$body[0]
来获取第一个实例。
由于此java
命名空间中有数据,该行仅提取此命名空间的所有子节点(->children("java", true)
)。
var_dump
只显示结果是包含数据的SimpleXMLelement。然后,您可以使用普通的SimpleXML元素访问(即$details->TotalAmount
)将其转换为字符串,以便为您提供原始数据。
答案 1 :(得分:1)