【问题标题】:How to get data on an XML response from a PHP Guzzle requests如何从 PHP Guzzle 请求中获取有关 XML 响应的数据
【发布时间】:2021-10-28 17:36:43
【问题描述】:

我有以下请求,我正在使用 guzzle 来处理它。我正在尝试在key => value 数组中获取 IDNAME,但它似乎不起作用。

$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,但都没有奏效。

请,任何帮助表示赞赏。

【问题讨论】:

  • Also, I used json_encode and json_decode...您为什么希望它们使用 XML?这真的没有意义。
  • it resulted in this response SimpleXMLElement {#642}... 请更新您的问题以准确显示您是如何使用它的。听起来你可能只是试图呼应整个外部元素而不深入研究它。有关基本用法的示例,请参阅php.net/manual/en/simplexml.examples-basic.php
  • The response gotten when I echo $results is shown below 123EXAMPLE...我假设您的意思是您在浏览器中看到了这个?这是因为浏览器将文档的其余部分视为标记(如 HTML - 因为 HTML 是 XML 的子集),因此不会显示它。您所看到的只是 XML 文档中仅有的几段文本。
  • 感谢您的更新。您所做的只是加载文档...如果您直接回显这些值,那么是的,您只会得到一个摘要。您需要做的是按照我给您的链接中的示例尝试访问其中的元素。
  • 感谢@ADyson 仍然无法通过您提供的链接访问数据。我试过$response2-&gt;diffgr-&gt;NewDataSet-&gt;NewDataSet-&gt;Table-&gt;ID 但没有回应。我也玩过获取值但没有结果的格式。

标签: php xml xml-namespaces


【解决方案1】:

似乎命名空间使情况复杂化。这段代码:

$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;

将为您提供数据。

它首先获取具有“diffgr”名称空间的外部 XML 的所有子项(在本例中只有一个)。然后在那个子元素中,它自己的子元素不再有命名空间,所以我们必须再次使用 children() 函数而不指定命名空间来检索它们。

现场演示:http://sandbox.onlinephpfunctions.com/code/3cd49767e5b1dd237d26b9f03ceff4dae0546eae

感谢this post 的想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多