如何从 PHP Guzzle 请求的 XML 响应中获取数据
How to get data on an XML response from a PHP Guzzle requests
我有以下请求,正在使用 guzzle 处理它。我正在尝试获取 ID 和 NAME 希望在 key => value
数组中,但它似乎不起作用。
$api_url = 'http://example.com/test.asmx/GetUserDetails?userID=123';
$client = new Client();
$results = $client->request('GET', $api_url)->getBody()->getContents();
dd($results);
我echo $results
得到的响应如下所示
123EXAMPLE
此外,当我 dd($results)
出现在三引号 """ """
中时得到的响应如下所示
"""
<?xml version="1.0" encoding="utf-8"?>
<DataSet xmlns="http://example.com">
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:msprop="urn:schemas-microsoft-com:xml-msprop">
<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="ID" type="xs:string" minOccurs="0" />
<xs:element name="NAME" 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">
<NewDataSet xmlns="">
<Table diffgr:id="Table1" msdata:rowOrder="0">
<ID>123</ID>
<NAME>EXAMPLE</NAME>
</Table>
</NewDataSet>
</diffgr:diffgram>
</DataSet>
"""
我尝试使用 SimpleXMLElement 但它导致了这个响应 SimpleXMLElement {#642}
$response1 = simplexml_load_string($results);
$response2 = SimpleXMLElement($results);
此外,我使用了 json_encode
和 json_decode
,但 none 有效。
拜托,我们将不胜感激。
似乎命名空间使情况复杂化。此代码:
$response2 = new SimpleXMLElement($results);
$children = $response2->children('diffgr', true);
$children2 = $children->children();
echo $children2->NewDataSet->Table->ID;
echo PHP_EOL; //newline
echo $children2->NewDataSet->Table->NAME;
将为您获取数据。
它首先获取外部 XML 的所有具有“diffgr”命名空间的子节点(在本例中只有一个)。然后在该子项中,它自己的子元素又没有命名空间,因此我们必须再次使用 children() 函数而不指定命名空间才能检索这些元素。
现场演示:http://sandbox.onlinephpfunctions.com/code/3cd49767e5b1dd237d26b9f03ceff4dae0546eae
创意归功于 this post。
我有以下请求,正在使用 guzzle 处理它。我正在尝试获取 ID 和 NAME 希望在 key => value
数组中,但它似乎不起作用。
$api_url = 'http://example.com/test.asmx/GetUserDetails?userID=123';
$client = new Client();
$results = $client->request('GET', $api_url)->getBody()->getContents();
dd($results);
我echo $results
得到的响应如下所示
123EXAMPLE
此外,当我 dd($results)
出现在三引号 """ """
中时得到的响应如下所示
"""
<?xml version="1.0" encoding="utf-8"?>
<DataSet xmlns="http://example.com">
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:msprop="urn:schemas-microsoft-com:xml-msprop">
<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="ID" type="xs:string" minOccurs="0" />
<xs:element name="NAME" 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">
<NewDataSet xmlns="">
<Table diffgr:id="Table1" msdata:rowOrder="0">
<ID>123</ID>
<NAME>EXAMPLE</NAME>
</Table>
</NewDataSet>
</diffgr:diffgram>
</DataSet>
"""
我尝试使用 SimpleXMLElement 但它导致了这个响应 SimpleXMLElement {#642}
$response1 = simplexml_load_string($results);
$response2 = SimpleXMLElement($results);
此外,我使用了 json_encode
和 json_decode
,但 none 有效。
拜托,我们将不胜感激。
似乎命名空间使情况复杂化。此代码:
$response2 = new SimpleXMLElement($results);
$children = $response2->children('diffgr', true);
$children2 = $children->children();
echo $children2->NewDataSet->Table->ID;
echo PHP_EOL; //newline
echo $children2->NewDataSet->Table->NAME;
将为您获取数据。
它首先获取外部 XML 的所有具有“diffgr”命名空间的子节点(在本例中只有一个)。然后在该子项中,它自己的子元素又没有命名空间,因此我们必须再次使用 children() 函数而不指定命名空间才能检索这些元素。
现场演示:http://sandbox.onlinephpfunctions.com/code/3cd49767e5b1dd237d26b9f03ceff4dae0546eae
创意归功于 this post。