首页 > 解决方案 > 告诉 XMLReader 忽略提供的命名空间信息

问题描述

我正在使用内置的 PHP 实例XMLReader来读取某种用户生成的 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 */

标签: phpxmlxmlreader

解决方案


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

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

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


推荐阅读