simplexml_load_string无法检索值

时间:2012-07-18 01:22:33

标签: php xml soap simplexml

我试图在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;

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

2 个答案:

答案 0 :(得分:0)

由于某种原因,最后ResponseId对我不起作用。

但是,我ResponseHdr作弊&#34;和I can select the first child

$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"

答案 1 :(得分:0)

试试这个:

将其另存为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>";
}
?>

希望这有帮助。