如何从 PHP Guzzle 请求的 XML 响应中获取数据

How to get data on an XML response from a PHP Guzzle requests

我有以下请求,正在使用 guzzle 处理它。我正在尝试获取 IDNAME 希望在 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_encodejson_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