将XML转换为JSON并获取值

时间:2018-01-23 07:37:40

标签: php json xml

我有一个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上的值,对此有何建议?

任何

2 个答案:

答案 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)

上面已经提到过PHP脚本的问题所以我想提出一些替代方案。

有很多选择可以实现这一目标。最重要的是x2js这是一个客户端解决方案。我尝试了你的XML,它在输出

方面效果很好
False

服务器端解决方案是YQL,它提供API来执行相同的任务。您可能会发现this有帮助。