【问题标题】:Cannot get Child Element Values in the XML无法在 XML 中获取子元素值
【发布时间】:2017-10-05 22:52:25
【问题描述】:

我收到来自 Web 服务的以下响应。我需要获取 dtAccData (FULL_NAME, GLOBAL_ID) 中的值

    <?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <strGetCustomerValidationResponse xmlns="http://tempuri.org/">
    <strGetCustomerValidationResult>21^Please complete your pending form^150675^1</strGetCustomerValidationResult>
    <dtAccData>
      <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
        <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="Table" msdata:UseCurrentLocale="true">
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="Table">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="FULL_NAME" type="xs:string" minOccurs="0" />
                <xs:element name="GLOBAL_ID" 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">
            <FULL_NAME>TEST39</FULL_NAME>
            <GLOBAL_ID>37405-9879863-7</GLOBAL_ID>
          </Table>
        </NewDataSet>
      </diffgr:diffgram>
    </dtAccData>
  </strGetCustomerValidationResponse>
</soap:Envelope>

如果我加载到简单的 XML 对象并转储,我看不到 dtAccData 中的任何值。我只在下面。

$xml = new SimpleXMLElement($xml_tring);
var_dump($xml);

我明白了

GetCustomerValidationResponse"]=> object(SimpleXMLElement)#2 (2) { ["strGetCustomerValidationResult"]=> string(45) "21^Please complete your pending form^630160^1" ["dtAccData"]=> object(SimpleXMLElement)#3 (0) { } } }

我该怎么办。

【问题讨论】:

  • 你为什么不使用 SOAP 扩展?
  • @ThW 我不知道可以使用 SOAP 扩展解析 XML。你能发布一个示例代码吗?
  • 你的例子不仅仅是 XML,它是 SOAP。 SOAP 使用 XML 作为基本格式/语法。 PHP 有一个扩展:php.net/soap
  • @ThW 是的,我知道,但是 SOAP 扩展没有任何方法来解析收到的结果 XML。

标签: php xml web-services domdocument


【解决方案1】:

这里我们使用DOMDocument 来提取元素内部的textContent

Try this code snippet here

<?php

ini_set('display_errors', 1);
$string='<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <strGetCustomerValidationResponse xmlns="http://tempuri.org/">
    <strGetCustomerValidationResult>21^Please complete your pending form^150675^1</strGetCustomerValidationResult>
    <dtAccData>
      <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
        <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="Table" msdata:UseCurrentLocale="true">
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="Table">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="FULL_NAME" type="xs:string" minOccurs="0" />
                <xs:element name="GLOBAL_ID" 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">
            <FULL_NAME>TEST39</FULL_NAME>
            <GLOBAL_ID>37405-9879863-7</GLOBAL_ID>
          </Table>
        </NewDataSet>
      </diffgr:diffgram>
    </dtAccData>
  </strGetCustomerValidationResponse>
</soap:Envelope>';
$domDocument= new DOMDocument();
$domDocument->loadXML($string);
echo $FULL_NAME=$domDocument->getElementsByTagName("FULL_NAME")->item(0)->textContent;
echo PHP_EOL;
echo $GLOBAL_ID=$domDocument->getElementsByTagName("GLOBAL_ID")->item(0)->textContent;

输出:

TEST39 37405-9879863-7

如果您的XML 回复包含否。您要从中提取信息的这些标签中的哪些。您可以使用此代码获取multiple occurences

Try this code snippet herefor multiple occurences

<?php

$domDocument= new DOMDocument();
$domDocument->loadXML($string);
$result=array();
foreach($domDocument->getElementsByTagName("FULL_NAME") as $fullnameElement)
{
    $result["FULL_NAME"][]=$fullnameElement->textContent;
}
foreach($domDocument->getElementsByTagName("GLOBAL_ID") as $fullnameElement)
{
    $result["GLOBAL_ID"][]=$fullnameElement->textContent;
}
print_r($result);

输出:

Array
(
    [FULL_NAME] => Array
        (
            [0] => TEST39
        )

    [GLOBAL_ID] => Array
        (
            [0] => 37405-9879863-7
        )

)

【讨论】:

  • 这对我来说就像一个魅力,因为我知道所有元素和每个元素的出现次数。谢谢萨希尔。如果你知道当我们有重复结构时我们应该怎么做,也请分享。无论如何,非常感谢。
  • @KasunRajapaksha 我已经更新了我的帖子,你可以查看它。欢迎...... :)
  • 精湛的萨希尔。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
相关资源
最近更新 更多