尝试使用 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_CostComparisonResponse
和 aims_CostComparisonResult
"urn:schemas-microsoft-com:xml-diffgram-v1"
(带有本地前缀 diffgr:
)用于 diffgram
""
对于 NewDataSet
、ExpressOptions
(您在代码中遗漏了)和 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;
我花了一周的时间试图从一个简单的 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_CostComparisonResponse
和aims_CostComparisonResult
"urn:schemas-microsoft-com:xml-diffgram-v1"
(带有本地前缀diffgr:
)用于diffgram
""
对于NewDataSet
、ExpressOptions
(您在代码中遗漏了)和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;