drqvsx1228 2015-12-10 06:59 采纳率: 0%
浏览 68

当存在双xml标记时从xml soap响应中获取元素值

I HAVE THIS XML RESPONSE FROM A SOAP CALL:

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><loginResponse xmlns="http://wws.adomain.com/"><loginResult><xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"><xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="replay" msdata:UseCurrentLocale="true"><xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded"><xs:element name="replay"><xs:complexType><xs:sequence><xs:element name="code" type="xs:string" minOccurs="0" /><xs:element name="description" type="xs:string" minOccurs="0" /></xs:sequence></xs:complexType></xs:element></xs:choice></xs:complexType></xs:element></xs:schema><diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"><DocumentElement xmlns=""><replay diffgr:id="replay1" msdata:rowOrder="0" diffgr:hasChanges="inserted"><code>OK</code><description>
<?xml version="1.0" encoding="UTF-8"?><root><token>e6d354f2-b284569e20-b2def8f3ef4a</token><nmDealer>SAP001 NAME</nmDealer><idRegDealer>8763</idRegDealer><idRegGrupo>-1</idRegGrupo><idRegPuntoVenta>-1</idRegPuntoVenta><idRegUsuario>35350731</idRegUsuario><idRegVendedor>-1</idRegVendedor><idRegZona>-1</idRegZona><dsTpUsuario>CLIENTES</dsTpUsuario><dsPais>PRODUCCION</dsPais><idioma>EN</idioma><idRegIdioma>9</idRegIdioma><isImputar>False</isImputar><moneda>€</moneda><tpUsuario>1</tpUsuario><idRegComisionVariableDealer>-1</idRegComisionVariableDealer><permitirComisionVariableDealer>1</permitirComisionVariableDealer><firstAccess>0</firstAccess><acceptedConditions>False</acceptedConditions><idRegInsured>-1</idRegInsured><idRegAuditor>-1</idRegAuditor></root></description></replay></DocumentElement></diffgr:diffgram></loginResult></loginResponse></soap:Body></soap:Envelope>

http://prntscr.com/9cfdwk


I want to be able to get the values of element (eg token) in the second xml tag (<?xml version="1.0" encoding="UTF-8"?>) Any prompt assistance will be appreciated.

HERE IS MY CODE:

$s = new soapclientw($wsdlfile);
if (empty($proxyhost))
{

}
else{
    $s->setHTTPProxy($proxyhost,$proxyport,$proxyusr,$proxypassword);
}
$result = $s->send($msg,'http://wws.domain.com/login',60);

$myXMLData = $s->responseData;

libxml_use_internal_errors(true);

$xml = simplexml_load_string($myXMLData);

if ($xml === false) {
    echo "Failed loading XML: ";
    foreach(libxml_get_errors() as $error) {
        echo "<br>", $error->message;
    }
} 
else{
    echo $xml->token;
}
  • 写回答

2条回答 默认 最新

  • dovgqc2648 2015-12-10 09:01
    关注

    Given your original, highly dubious xml, the following is a bit of a hack but it works..

        $strxml='
        <?xml version="1.0" encoding="utf-8"?>
            <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                <soap:Body>
                    <loginResponse xmlns="http://wws.adomain.com/">
                        <loginResult>
                            <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
                                <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="replay" msdata:UseCurrentLocale="true">
                                    <xs:complexType>
                                        <xs:choice minOccurs="0" maxOccurs="unbounded">
                                            <xs:element name="replay">
                                                <xs:complexType>
                                                    <xs:sequence>
                                                        <xs:element name="code" type="xs:string" minOccurs="0" />
                                                        <xs:element name="description" type="xs:string" minOccurs="0" />
                                                    </xs:sequence>
                                                </xs:complexType>
                                            </xs:element>
                                        </xs:choice>
                                    </xs:complexType>
                                </xs:element>
                            </xs:schema>
                            <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
                                <DocumentElement xmlns="">
                                    <replay diffgr:id="replay1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
                                        <code>OK</code>
                                        <description>
                                            <?xml version="1.0" encoding="UTF-8"?>
                                            <root>
                                                <token>e6d354f2-b284569e20-b2def8f3ef4a</token>
                                                <nmDealer>SAP001 NAME</nmDealer>
                                                <idRegDealer>8763</idRegDealer>
                                                <idRegGrupo>-1</idRegGrupo>
                                                <idRegPuntoVenta>-1</idRegPuntoVenta>
                                                <idRegUsuario>35350731</idRegUsuario>
                                                <idRegVendedor>-1</idRegVendedor>
                                                <idRegZona>-1</idRegZona>
                                                <dsTpUsuario>CLIENTES</dsTpUsuario>
                                                <dsPais>PRODUCCION</dsPais>
                                                <idioma>EN</idioma>
                                                <idRegIdioma>9</idRegIdioma>
                                                <isImputar>False</isImputar>
                                                <moneda>€</moneda>
                                                <tpUsuario>1</tpUsuario>
                                                <idRegComisionVariableDealer>-1</idRegComisionVariableDealer>
                                                <permitirComisionVariableDealer>1</permitirComisionVariableDealer>
                                                <firstAccess>0</firstAccess>
                                                <acceptedConditions>False</acceptedConditions>
                                                <idRegInsured>-1</idRegInsured>
                                                <idRegAuditor>-1</idRegAuditor>
                                            </root>
                                        </description>
                                    </replay>
                                </DocumentElement>
                            </diffgr:diffgram>
                        </loginResult>
                    </loginResponse>
                </soap:Body>
            </soap:Envelope>';
    
    
        $strxml=htmlentities( $strxml );
        $search=array( 
            htmlentities( '<?xml version="1.0" encoding="utf-8"?>' ),
            htmlentities( '<?xml version="1.0" encoding="UTF-8"?>' )
        );
        $strxml=html_entity_decode( str_replace( $search, '', $strxml ) );
    
        libxml_use_internal_errors( true );
        $dom = new DOMDocument('1.0','utf-8');
        $dom->validateOnParse=false;
        $dom->standalone=true;
        $dom->preserveWhiteSpace=true;
        $dom->strictErrorChecking=false;
        $dom->substituteEntities=false;
        $dom->recover=true;
        $dom->formatOutput=false;
        $dom->loadXML( $strxml );
        libxml_clear_errors();
    
        $col=$dom->getElementsByTagName('root')->item(0);
        if( $col ){
            foreach( $col->childNodes as $node ) echo $node->tagName.' '.$node->nodeValue.BR;   
        }
        $dom=null;
    
    评论

报告相同问题?

悬赏问题

  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染