难以使用返回空对象的simplexml_load_string解析xml字符串

时间:2018-04-02 21:46:32

标签: php xml simplexml-load-string

我一直在试图弄清楚如何解析这个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>

我以为我应该得到一些东西而不是空物。

3 个答案:

答案 0 :(得分:1)

正如所指出的那样 - print_r()检查你加载到SimpleXMLElement中的内容是错误的。如果您想查看内容,请使用->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

答案 1 :(得分:0)

即使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)&#34; DataSet&#34;

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

答案 2 :(得分:0)

两件事导致我的成功。 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)