尝试使用 Simple_xml_load_string 解析 XML 以获取大部分内部数据

Trying to Prase XML using Simple_xml_load_string to get most inner data

我花了一周的时间试图从一个简单的 XML 调用中获取一些数据。阅读了此处和其他地方的许多文章后,none 实际上解释了为什么我无法将简单的 XML 放入数组或 JSON。所以,这是 XML:

的一部分
<s:Envelope
xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
    <aims_CostComparisonResponse
        xmlns="http://tempuri.org/">
        <aims_CostComparisonResult>
            <xs:schema id="NewDataSet"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns=""
                xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
                <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
                    <xs:complexType>
                        <xs:choice minOccurs="0" maxOccurs="unbounded">
                            <xs:element name="ExpressOptions">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="ComparisonName" type="xs:string" minOccurs="0"/>
                                        <xs:element name="ServiceInformation" type="xs:string" minOccurs="0"/>
                                        <xs:element name="ShippingCharge" type="xs:decimal" minOccurs="0"/>
                                        <xs:element name="TransitLow" type="xs:int" minOccurs="0"/>
                                        <xs:element name="TransitHigh" type="xs:int" minOccurs="0"/>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:choice>
                    </xs:complexType>
                </xs:element>
            </xs:schema>
            <diffgr:diffgram
                xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"
                xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
                <NewDataSet
                    xmlns="">
                    <ExpressOptions diffgr:id="ExpressOptions1" msdata:rowOrder="0">
                        <ComparisonName>17:30</ComparisonName>
                        <ServiceInformation></ServiceInformation>
                        <ShippingCharge>0.00</ShippingCharge>
                        <TransitLow>1</TransitLow>
                        <TransitHigh>1</TransitHigh>
                    </ExpressOptions>
                </NewDataSet>
            </diffgr:diffgram>
        </aims_CostComparisonResult>
    </aims_CostComparisonResponse>
</s:Body>

简而言之,我试图获取 ExpressOptions 中位于 NewDataSet 下的每个节点。

我已经尝试了多种方法来转换响应,就像上面一样原始,没有任何信息返回。除非我把 $xml->getName() 给了我“Envolope”。

响应来自 CURL 调用:

 $xml = simplexml_load_string($response);

然后我尝试手动深入了解给定 table:

的布局
echo($xml->Body->aims_CostComparisonResponse->aims_CostComparisonResult->{'diffgr:diffgram'}->NewDataSet[0]->ComparisonName);

期望得到“UPS”之类的东西,但只是空的。阅读关于简单 XML 加载字符串的 PHP 手册,我尝试了以下操作:

$xml = simplexml_load_string($response);
$json = json_encode($xml);
$xmlArray = json_decode($json, TRUE);

$xml = simplexml_load_string($response);
$xmlArray = (array)$xml;

我似乎无法 A) 直接从中获取任何信息,甚至使用 echo ($xml->Body->aims_CostComparisonResponse->aims_CostComparisonResult 的东西。还有各种 ForEach 使用 $xml->children 来查找路径。

我可以使用 echo htmlentities($response) 回应 $response。所以我知道数据在那里,但我不知道如何获取信息。请提供任何指导。

您遇到困难的原因是因为此 XML 包含多个命名空间,如以下问题所述:

要获得所需的元素,您需要遍历这些命名空间(只需查找 xmlns 属性):

  • "http://schemas.xmlsoap.org/soap/envelope/"(带有本地前缀 s:)对于 Body(您的 $xml 变量将指向 Envelope,但您仍然需要 select命名空间)
  • "http://tempuri.org/" 对于 aims_CostComparisonResponseaims_CostComparisonResult
  • "urn:schemas-microsoft-com:xml-diffgram-v1"(带有本地前缀 diffgr:)用于 diffgram
  • "" 对于 NewDataSetExpressOptions(您在代码中遗漏了)和 ComparisonName

所以最终链看起来像这样:

echo $xml->children("http://schemas.xmlsoap.org/soap/envelope/")->Body
         ->children("http://tempuri.org/")->aims_CostComparisonResponse->aims_CostComparisonResult
         ->children("urn:schemas-microsoft-com:xml-diffgram-v1")->diffgram
         ->children("")->NewDataSet->ExpressOptions->ComparisonName;