php - 告诉 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 */
解决方案
命名空间信息是基本信息,XML 解析器不可能忽略它。
您的选择是 (a) 将文件发送回发件人,说它不符合约定的架构,或者 (b) 通过更改命名空间来转换发送给您的文件以使其符合。这是一个相当简单的 XSLT 转换。
我的直觉是查看 OpenImmo 规范,看看他们对命名空间和模式一致性的看法,但不幸的是,访问规范需要注册和许可。基本上,要么规范允许这两种格式,这将是一个相当劣质的规范,要么它们只允许其中一种,在这种情况下你不应该同时接受这两种格式。
推荐阅读
- java - TCP 通过 TETRA 协议
- docker - 从一个容器到另一个容器执行代码(即从 API 容器在工作容器上执行脚本)
- python - 将 RowNumber 添加到字典列表
- ios - 如何在 Swift 中重置 UICollectionView
- java - 在Java中以同一方法迭代多个列表的最佳方法是什么
- javascript - D3 设计可重用组件以在“调用”期间接受参数
- spring-boot - 如何为所有扩展类型请求制作控制器?
- excel - 如何锁定宏文件中记录的单元格并使它们具有不同的颜色(也锁定)
- python - 倒排索引,我可以保存单词的元组以及它来自哪里的 id
- node.js - 如何访问 koa.js 中的响应