我一直在试图弄清楚如何解析这个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>
我以为我应该得到一些东西而不是空物。
答案 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)
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)