告诉 XMLReader 忽略提供的命名空间信息



我正在使用内置XMLReader的PHP实例来读取某种用户生成的XML文件。通常,此 XML 文件内容类似于以下示例代码段,其中一切正常:

<?xml version="1.0" encoding="UTF-8"?>
<openimmo>
<uebertragung art="OFFLINE" umfang="VOLL" version="1.2.7" (...)

但是,另一个用户使用不同的软件来发送和生成 XML 文件。该软件生成的 XML 的开头如下:

<?xml version="1.0" encoding="UTF-8"?>
<openimmo xmlns="http://www.openimmo.de" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openimmo.de openimmo.xsd">
<uebertragung art="OFFLINE" umfang="VOLL" version="1.2.7" (...)

这导致我的导入程序失败并出现以下错误:

XMLReader::read(): Element '{http://www.openimmo.de}openimmo': No matching global declaration available for the validation root.

我已经通过手动应用一些 XSD 架构进行验证。传递的文件遵循相同的架构,只是显式指定xmlns属性。如何解决此问题?我怎么能告诉XMLReader忽略xmlns陈述呢?

我的代码(简化为相关部分(类似于以下代码片段:

$reader = new XMLReader();
$success = @$reader->open($path);
if (!$success) { /* error handling */ }
$reader->setSchema($localOpenImmoXsdPath);
/* then starts reading and throws the above exception */

命名空间信息是基本的,XML 解析器不可能忽略它。

您的选择是 (a( 将文件发送回发件人,说它不符合商定的架构,或者 (b( 通过更改命名空间来转换发送给您的文件,使其符合要求。这是一个相当简单的 XSLT 转换。

我的直接直觉是查看OpenImmo规范,看看他们对命名空间和模式一致性的看法,但不幸的是,访问规范需要注册和许可。基本上,要么规范允许这两种格式,这将是一个非常劣质的规范,要么他们只允许其中一种,在这种情况下,你不应该同时接受这两种格式。

最新更新