SOAP包含所有XMLNS的解析 - 不适用于Magento

时间:2016-11-10 15:07:10

标签: php xml magento soap

我尝试过并尝试过并且无法提出解决方案。我的问题是: 我有一个SOAP信封响应,如下所示......

    <soapenv:envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:header>
        <soapenv:body>
            <mcu:prescreenusereligibilityresponse xmlns:mcu="http://www.ups.com/XMLSchema/XOLTWS/MCUserEligibility/v1.0">
                <common:response xmlns:common="http://www.ups.com/XMLSchema/XOLTWS/Common/v1.0">
                    <common:responsestatus>
                        <common:code>1</common:code>
                        <common:description>Success</common:description>
                    </common:responsestatus>
                </common:response>
                <mcu:eligibilitystatuscode>3</mcu:eligibilitystatuscode>
            </mcu:prescreenusereligibilityresponse>
        </soapenv:body>
    </soapenv:header>
</soapenv:envelope>

然后我在我的mac上访问这样的元素:

$ns=array();
$xml=new SimpleXMLElement($string);
foreach($xml->getNamespaces(true) as $key=>$url){
    $xml->registerXPathNamespace($key, $url);
    $ns[]=strval($url);

}
print_r(strval($xml->children($ns[0])->header->body->children($ns[1])->prescreenusereligibilityresponse->eligibilitystatuscode));

在单独的Linux实例上使用相同的方法我在print_r行上收到错误,说最后一个子节点不能为空。我已经确认这些值是正确的。我也尝试使用$xml->xpath('//mcu:eligibilitystatuscode')但没有成功。

我真的被困了-_-

2 个答案:

答案 0 :(得分:1)

我用了另一种方法。 DOMDocument()

我注意到在将不同的对象节点打印到屏幕后,xml字符串中的大小写是不同的。我尝试使用正确的大小写比较命名空间,但仍然没有使用SimpleXML成功。

$doc = new DOMDocument();

            $doc->loadXML($result);
            if($doc){
                foreach($doc->getElementsByTagNameNS('*', '*') as $element){
                    if($element->tagName=='mcu:EligibilityStatusCode'){
                        if($element->nodeValue==0){
                            return true;
                        }
                        else{
                            return false;
                        }
                    }
                }
                return false;
            }
            else{
                return false;
            }

上面是工作代码,其中result是soap请求返回的xml。我的代码基本上循环遍历xml响应中的每个节点。而这又显示在Magento前端的一个区块上。

答案 1 :(得分:0)

考虑到你说它适用于你的Mac而不适用于Linux,行结尾可能是一个问题。在解析XML之前,尝试添加此项以使用您运行的系统的默认值替换所有可能的行结尾。

$string = preg_replace('~\R~u', PHP_EOL, $string);