【问题标题】:simplexml_load_string unable to retrieve valuessimplexml_load_string 无法检索值
【发布时间】:2012-07-18 01:22:33
【问题描述】:

我正在尝试获取 ResponseId 和 MAP_IMAGE_ZOOM1000 中的值,但我收到来自 var_dump 的空响应。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org   /soap/envelope/">
<soapenv:Header xmlns:get="http://tnb.com.my/CGIS/D/getcustareasnapshotpro"  xmlns:bsm="http://www.tnb.com.my/CGIS/schemas/bsmfpro" xmlns:cgis="http://tnb.com.my/CGIS/D/cgis_cmccustomermgnt"/>
<soapenv:Body xmlns:get="http://tnb.com.my/CGIS/D/getcustareasnapshotpro" xmlns:bsm="http://www.tnb.com.my/CGIS/schemas/bsmfpro" xmlns:cgis="http://tnb.com.my/CGIS/D/cgis_cmccustomermgnt">
<get1:GetCustAreaSnapshotResponseParam xmlns:get1="http://tnb.com.my/CGIS/D/getcustareasnapshotcon">
     <ResponseHdr>
        <bsm:ResponseId>gero etgero etgero etgero etgero</bsm:ResponseId>
        <bsm:ResTransactionId>123456789012345</bsm:ResTransactionId>
        <bsm:ProviderId>CGIS</bsm:ProviderId>
        <bsm:ResTimestamp>2004-02-15T02:44:14</bsm:ResTimestamp>
        <bsm:ResStatus>SUCC</bsm:ResStatus>
        <bsm:MsgCode>IM-001</bsm:MsgCode>
        <bsm:MsgDesc>Success</bsm:MsgDesc>
     </ResponseHdr>
     <ResGetCustAreaSnapshot>
        <cmc:GetCustAreaSnapshot xmlns:cmc="http://tnb.com.my/CGIS/D/cmc_customermgnt">
        <cmc:MAP_IMAGE_ZOOM1000>abc</cmc:MAP_IMAGE_ZOOM1000>
        </cmc:GetCustAreaSnapshot>
     </ResGetCustAreaSnapshot>
  </get1:GetCustAreaSnapshotResponseParam>

$Envelope = simplexml_load_string($responseXml);

$Envelope->registerXPathNamespace('soap','http://schemas.xmlsoap.org/soap/envelope/');
$Envelope->registerXPathNamespace('bsm','http://www.tnb.com.my/CGIS/schemas/bsmfpro/');
$Envelope->registerXPathNamespace('cmc','http://tnb.com.my/CGIS/D/cgis_cmccustomermgnt/');
$Envelope->registerXPathNamespace('get','http://tnb.com.my/CGIS/D/getcustareasnapshotcon/');
$result = $Envelope->xpath('soap:Envelope/soap:Body/get:GetCustAreaSnapshotResponseParam/ResponseHdr/bsm:ResponseId');

var_dump($result);

die;

任何帮助将不胜感激。谢谢!!

【问题讨论】:

    标签: php xml soap simplexml


    【解决方案1】:

    由于某种原因,最后一个 ResponseId 不适合我。

    然而,我“作弊”了,I can select the first childResponseHdr

    $result = $Envelope->xpath('//soapenv:Envelope/soapenv:Body/get1:GetCustAreaSnapshotResponseParam/ResponseHdr/*[1]');
    

    编辑: Here 是我能用 SimpleXML 做的最好的事情。不过我会尝试 DOMDocument,因为它可能是更好的选择。

    $result = $Envelope->xpath('//soapenv:Envelope/soapenv:Body/get1:GetCustAreaSnapshotResponseParam/ResponseHdr');    
    foreach( $result[0]->children('bsm', true) as $node) var_dump( $node->getName() . ' = ' . (string) $node);
    
    $result = $Envelope->xpath('//soapenv:Envelope/soapenv:Body/get1:GetCustAreaSnapshotResponseParam/ResGetCustAreaSnapshot/*[1]');    
    foreach( $result[0]->children('cmc', true) as $node) var_dump( $node->getName() . ' = ' . (string) $node);
    

    根据上面的代码,我能够得到以下输出:

    string(45) "ResponseId = gero etgero etgero etgero etgero"
    string(34) "ResTransactionId = 123456789012345"
    string(17) "ProviderId = CGIS"
    string(34) "ResTimestamp = 2004-02-15T02:44:14"
    string(16) "ResStatus = SUCC"
    string(16) "MsgCode = IM-001"
    string(17) "MsgDesc = Success"
    string(24) "MAP_IMAGE_ZOOM1000 = abc"
    

    【讨论】:

    【解决方案2】:

    试试这个:

    另存为 ns.xml

    <?xml version="1.0" encoding="utf-8"?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
        <soapenv:Header xmlns:get="http://tnb.com.my/CGIS/D/getcustareasnapshotpro"  xmlns:bsm="http://www.tnb.com.my/CGIS/schemas/bsmfpro" xmlns:cgis="http://tnb.com.my/CGIS/D/cgis_cmccustomermgnt"/>
        <soapenv:Body xmlns:get="http://tnb.com.my/CGIS/D/getcustareasnapshotpro" xmlns:bsm="http://www.tnb.com.my/CGIS/schemas/bsmfpro" xmlns:cgis="http://tnb.com.my/CGIS/D/cgis_cmccustomermgnt">
            <get1:GetCustAreaSnapshotResponseParam xmlns:get1="http://tnb.com.my/CGIS/D/getcustareasnapshotcon">
                <ResponseHdr>
                    <bsm:ResponseId>gero etgero etgero etgero etgero</bsm:ResponseId>
                    <bsm:ResTransactionId>123456789012345</bsm:ResTransactionId>
                    <bsm:ProviderId>CGIS</bsm:ProviderId>
                    <bsm:ResTimestamp>2004-02-15T02:44:14</bsm:ResTimestamp>
                    <bsm:ResStatus>SUCC</bsm:ResStatus>
                    <bsm:MsgCode>IM-001</bsm:MsgCode>
                    <bsm:MsgDesc>Success</bsm:MsgDesc>
                </ResponseHdr>
                <ResGetCustAreaSnapshot>
                    <cmc:GetCustAreaSnapshot xmlns:cmc="http://tnb.com.my/CGIS/D/cmc_customermgnt">
                        <cmc:MAP_IMAGE_ZOOM1000>abc</cmc:MAP_IMAGE_ZOOM1000>
                    </cmc:GetCustAreaSnapshot>
                </ResGetCustAreaSnapshot>
            </get1:GetCustAreaSnapshotResponseParam>
        </soapenv:Body>
    </soapenv:Envelope>
    

    获取节点的 PHP 代码:

    <?php
    $xml = simplexml_load_file( 'ns.xml' );
    
    $xml->registerXPathNamespace('b', 'http://www.tnb.com.my/CGIS/schemas/bsmfpro');
    $xml->registerXPathNamespace('c', 'http://tnb.com.my/CGIS/D/cmc_customermgnt');
    
    $xpath = $xml->xpath( '//b:ResponseId | //c:MAP_IMAGE_ZOOM1000' );
    
    foreach( $xpath as $key => $value ) {
        // echo the node name and its value
        echo $value->getName() . ' => ' . $value . "\n<br>";
    }
    ?>
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 2015-02-03
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多