【发布时间】:2018-05-27 16:15:22
【问题描述】:
我需要使用 php 解析从第三方收到的 xml 文档。我无法要求文档的维护者修复其结构。当我使用simplexml_load_file 解析文档时,XML 文档为空。
这是我所看到的一个精简示例。
我的文件.xml:
<?xml version="1.0" encoding="utf-8"?>
<DataSet>
<diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
aaa
</diffgr:diffgram>
</DataSet>
我这样处理它(从命令行):
php > $xml = simplexml_load_file('my-file.xml');
php > print_r($xml);
SimpleXMLElement Object
(
)
我期待通过print_r显示xml结构。
确实,当我删除命名空间声明时,一切似乎都正常了(尽管会出现一些预期的 XML 解析警告):
我的文件-nonamespace.xml:
<?xml version="1.0" encoding="utf-8"?>
<DataSet>
<diffgr:diffgram>
aaa
</diffgr:diffgram>
</DataSet>
在命令行上以相同的方式处理它(删除警告):
php > $xml = simplexml_load_file('my-file-nonamespace.xml');
// a bunch of xml parse warnings
php > print_r($xml);
SimpleXMLElement Object
(
[diffgr:diffgram] =>
aaa
)
因此,问题与无效的命名空间声明有关。我可能可以在文件上使用正则表达式在解析之前删除命名空间声明,但这不是我想要的方向。
在 PHP 中正确解析第一个文档的最佳方法是什么?
【问题讨论】:
-
在 SimpleXMLElement 上使用
print_r通常不会提供您需要的所有信息。 -
我没有在我的实际代码中使用
print_r。我只是用它来说明第一个文件似乎没有孩子,而第二个文件有。当我在第一个文件上调用var_dump($xml->children());时,我得到 0 个元素。在第二个文件中,我得到 1 个元素。所以,很明显,body 没有被解析。
标签: php xml xml-namespaces