SimpleXML和print_r() – 为什么这是空的?

您好,这里是我的XML文件:(thefile)

<?xml version="1.0" encoding="utf-8"?> <ArrayOfItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://nts-de-osm1-pxc/webservices/"> <Item xmlns:q1="http://systinet.com/wsdl/com/osm/webservices/service/" xsi:type="q1:Document"> <q1:attributes> <q1:Attribute> <q1:dataDictionary xsi:nil="true" /> <q1:dataType>string</q1:dataType> <q1:displayName>AEND_DATUM</q1:displayName> <q1:key>false</q1:key> <q1:name>AEND_DATUM</q1:name> <q1:searchable>true</q1:searchable> <q1:userAttribute>true</q1:userAttribute> <q1:value>10.05.10</q1:value> </q1:Attribute> <q1:Attribute> <q1:dataDictionary xsi:nil="true" /> <q1:dataType>string</q1:dataType> <q1:displayName>AEND_PRUEF_DATUM</q1:displayName> <q1:key>false</q1:key> <q1:name>AEND_PRUEF_DATUM</q1:name> <q1:searchable>true</q1:searchable> <q1:userAttribute>true</q1:userAttribute> <q1:value>10.05.10</q1:value> </q1:Attribute> </q1:attributes> </Item> </ArrayOfItem> 

这是我的代码

 $xml = simplexml_load_file($thefile); print_r($xml); 

这是输出

 SimpleXMLElement Object ( [Item] => SimpleXMLElement Object ( ) ) 

为什么这是空的?

不要使用print_r()或var_dump()来检查一个SimpleXMLElement,它们不一定会对它们起作用,因为SimpleXML在场景后面使用了很多魔法。 相反,看看asXML()返回的是什么。

在你的情况下,它不显示<q1:attributes/>因为它们不在同一个命名空间中。

编辑

要访问这些命名空间节点,有许多不同的方法, 其中大部分在Stack Overflow中讨论 。 如果你不能解决这个问题,请提出一个新的问题,因为这个问题是不同的。 以下是访问这些元素的三种方法:

 $ArrayOfItem->Item->children("http://systinet.com/wsdl/com/osm/webservices/service/"); $ArrayOfItem->Item->children('q1', true); $ArrayOfItem->Item->xpath('//q1:Attribute'); 

simpleXMLparsing器应该提供一个有意义的错误信息,您可以获取并输出。 查看libxml_get_errors()的文档中的示例代码。

两件事情:

  • 您错过了q1:属性的结束标记。
  • SimpleXML无法处理<q1:Attributes>types标签。 我将它改为<q1> ,它一直工作到这个标签。

我想你在这里需要SimpleXMLparsing器