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

Tell XMLReader to ignore provided namespace info

我正在使用内置 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 规范,看看他们对名称空间和模式一致性的看法,但不幸的是,访问规范需要注册和许可。基本上,规范要么允许这两种格式,这将是一个非常劣质的规范,要么它们只允许其中一种格式,在这种情况下你不应该接受两种格式。