编程语言
首页 > 编程语言> > 用php解析SOAP XML响应

用php解析SOAP XML响应

作者:互联网

我已经检查了多个示例和w3Schools教程,但无法弄清楚SOAP响应的结构.我已经十多年没有接触php / xml了,所以您可以考虑将我视为初学者.

这是我得到的回应的样本

<DataSet xmlns="http://www.multiprets.net/api">
    <xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet">
        <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
            <xs:complexType>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element name="Table">
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element name="ProductSequence" type="xs:string" minOccurs="0"/>
                                <xs:element name="ProductCode" type="xs:string" minOccurs="0"/>
                                <xs:element name="ProdNameEn" type="xs:string" minOccurs="0"/>
                                <xs:element name="ProdNameFr" type="xs:string" minOccurs="0"/>
                                <xs:element name="ProductTerm" type="xs:double" minOccurs="0"/>
                                <xs:element name="UpdDate" type="xs:int" minOccurs="0"/>
                                <xs:element name="UpdTime" type="xs:int" minOccurs="0"/>
                                <xs:element name="Posted" type="xs:double" minOccurs="0"/>
                                <xs:element name="MPH" type="xs:double" minOccurs="0"/>
                                <xs:element name="CNT" type="xs:int" 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">
        <NewDataSet xmlns="">
            <Table diffgr:id="Table1" msdata:rowOrder="0">
                <ProductSequence>A1999</ProductSequence>
                <ProductCode>VC</ProductCode>
                <ProdNameEn>3 years variable</ProdNameEn>
                <ProdNameFr>3 ans variable</ProdNameFr>
                <ProductTerm>3</ProductTerm>
                <UpdDate>20140529</UpdDate>
                <UpdTime>134900</UpdTime>
                <Posted>3</Posted>
                <MPH>3</MPH>
                <CNT>1</CNT>
            </Table>
            <Table diffgr:id="Table2" msdata:rowOrder="1">
                <ProductSequence>A4000</ProductSequence>
                <ProductCode>VC</ProductCode>
                <ProdNameEn>5 years variable</ProdNameEn>
                <ProdNameFr>5 ans variable</ProdNameFr>
                <ProductTerm>5</ProductTerm>
                <UpdDate>20141021</UpdDate>
                <UpdTime>103100</UpdTime>
                <Posted>3</Posted>
                <MPH>2.3</MPH>
                <CNT>1</CNT>
            </Table>

我试图获取< MPH>使用以下代码来自table8的代码:

$client = new soapclient("http://www.multiprets.net/api/ws/services.asmx?wsdl"); 
$objectresult = $client->Recupere_meilleurs_Taux(array('Code_businessID'=> '**LoginString**','trace' => 1)); 
$resultat = simplexml_load_string($objectresult->Recupere_meilleurs_TauxResult->any); 
foreach ($resultat->xpath('//Table[@id='Table8']') as $product){ echo $product->MPH."< br/ >"; }

无济于事,因为它没有返回任何结果.如果我从xpath中删除该属性,而仅保留// Table,那么我将从所有表中获取MPH,因此我可以肯定它带有@id属性

预先感谢您抽出宝贵的时间并分享您的知识.

解决方法:

这里的问题是您的属性具有名称空间,因此您需要向SimpleXML XPath注册ns并在XPath查询中使用它.

此元素为其后代声明两个名称空间:

<diffgr:diffgram 
    xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
    xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">

要使用SimpleXML注册这些名称空间,您需要使用功能registerXPathNamespace.根据您正在执行的其他查询,您可能希望注册两个名称空间.对于您的查询,您需要urn:schemas-microsoft-com:xml-diffgram-v1(diffgr)命名空间;像这样注册:

$sxe = new SimpleXMLElement($your_xml_here);
$sxe->registerXPathNamespace('d', 'urn:schemas-microsoft-com:xml-diffgram-v1');

现在,您可以通过在前缀d之前添加diffgr命名空间中的任何元素或属性.这是一个使用ID为Table1的Table元素的示例:

$tables = $sxe->xpath('//Table[@d:id="Table1"]');
foreach ($tables as $t) {
    echo $t->ProductSequence . PHP_EOL;
}

输出:

A1999

标签:php,xml,xpath,soap-client
来源: https://codeday.me/bug/20191009/1879572.html