【问题标题】:Having difficulty parsing xml string using simplexml_load_string which returns an empty object使用返回空对象的 simplexml_load_string 解析 xml 字符串时遇到困难
【发布时间】:2018-04-02 21:46:31
【问题描述】:

我一直在试图弄清楚如何解析这个 xml 字符串。

我得到一个从 simplexml_load_string 返回的空对象。

非常感谢任何关于如何进行的想法。

SimpleXMLElement Object
(
)

这是从 ASP.net 服务器接收的 XML。正在尝试使用 PHP 进行解析。

<?xml version="1.0" encoding="utf-8"?>
<DataSet>
  <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:UseCurrentLocale="true">
      <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="Table">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="MadeBy" minOccurs="0">
                  <xs:simpleType>
                    <xs:restriction base="xs:string">
                      <xs:maxLength value="50" />
                    </xs:restriction>
                  </xs:simpleType>
                </xs:element>
                <xs:element name="Note" minOccurs="0">
                  <xs:simpleType>
                    <xs:restriction base="xs:string">
                      <xs:maxLength value="255" />
                    </xs:restriction>
                  </xs:simpleType>
                </xs:element>
                <xs:element name="DateMade" type="xs:dateTime" 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>
      <Table diffgr:id="Table1" msdata:rowOrder="0">
        <MadeBy>admin</MadeBy>
        <Note>Test note v2, now with added characters for a longer note!</Note>
        <DateMade>2018-04-02T12:45:18.503-04:00</DateMade>
      </Table>
      <Table diffgr:id="Table2" msdata:rowOrder="1">
        <MadeBy>admin</MadeBy>
        <Note>Test application with a test note</Note>
        <DateMade>2018-04-02T12:44:56.05-04:00</DateMade>
      </Table>
    </NewDataSet>
  </diffgr:diffgram>
</DataSet>

我想我应该得到一些东西,而不是一个空的对象。

【问题讨论】:

  • 如果您不向我们展示您的代码,我们很难提供帮助。
  • 这是让它为我工作的关键:` $notes_obj = simplexml_load_string($notes);` ` $children = $notes_obj->children('urn:schemas-microsoft-com:xml -diffgram-v1')->儿童(); `

标签: php xml simplexml


【解决方案1】:

正如所指出的 - print_r() 是错误的检查您已加载到 SimpleXMLElement 中的内容。如果您想查看内容,请使用-&gt;asXML(),它将打印出任何元素的 XML。

以下代码显示了如何访问您拥有的 XML 中的数据,我使用 simplexml_load_string,但 loaf_file 给出了相同的结果...

$xml = simplexml_load_string($data);
print_r($xml);
echo $xml->asXML();
$data = $xml->children("diffgr", true)[0];
foreach ( $data->children("", true)->NewDataSet->Table as $table )  {
    echo "MadeBy=".$table->MadeBy.PHP_EOL;
}

我使用children() 方法,因为命名空间中有元素,这使您可以轻松获取这些元素。 children("diffgr", true) 以命名空间前缀 diffgr 获取元素,稍后我使用 "" 获取默认命名空间中的元素。

这输出...

SimpleXMLElement Object
(
)
<?xml version="1.0" encoding="utf-8"?>
<DataSet>
  <xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet">
    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
      <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">

         ...

        <DateMade>2018-04-02T12:44:56.05-04:00</DateMade>
      </Table>
    </NewDataSet>
  </diffgr:diffgram>
</DataSet>
MadeBy=admin
MadeBy=admin

【讨论】:

    【解决方案2】:

    即使 XML 已正确加载,SimpleXMLElement 实例有时对于 print_r()var_dump() 之类的函数可能会显示为空,因为该类只是 PHP 和 LibXML 之间的接口。

    我已经测试了您的 XML 代码并且它可以正确加载,SimpleXMLElement 的所有方法都可以正确使用。

    例如

    var_dump($e = simplexml_load_string(...));
    var_dump($e->getName());
    

    打印

    对象(SimpleXMLElement)#1 (0) {
    }
    string(7) "数据集"

    这个帖子有一些关于如何使用标准接口检测和处理 PHP 中的 LibXML 错误的好主意:simplexml error handling php

    【讨论】:

      【解决方案3】:

      有两件事让我成功了。 print_r 没有显示我的想法和children 方法。我一直在 php.net 文档中忽略该方法。

       $notes_obj = simplexml_load_string($notes);
      
       $children = $notes_obj->children('urn:schemas-microsoft-com:xml-diffgram-v1')->children();
      

      并使用

      var_export($notes_obj, true)
      

      【讨论】:

      • “感谢”其他 SO 用户的最佳方式是对他们的答案进行投票。如果您发现一个特别有用的答案,请对他们的答案投票,而不是直接回复他们。这就是游戏化的运作方式。 ;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      • 2019-12-05
      • 1970-01-01
      相关资源
      最近更新 更多