在PHP中验证XML并生成“人类可读”的错误消息?

我正在尝试构建一个用于验证特定XML并输出人类可读结果的工具 . 我现有的PHP代码使用DOMDocument :: schemaValidate来根据.xsd文件验证XML,但错误消息不是很友好 .

例如,让我们假装我的XML看起来像下面的示例,并且纬度应该是小数:

<Person>
  <FirstName>Bret</FirstName>
  <Location>
    <Address>123 Test Ave.</Address>
    <Latitude></Latitude>
    <Longitude>30.139338</Longitude>
  </Location>
</Person>

我目前得到的错误信息是:

Document :: schemaValidate():元素'纬度':''不是原子类型'xs:decimal'的有效值 .

我想要它说:

XML Line#5中的错误:“Bret”人的地址中有一个空的纬度 . 您必须包含有效的纬度才能让我们处理此XML .

之前曾提出过类似的问题:

但是,如果DOMDocument :: schemaValidate不是这项工作的正确工具,我愿意使用PHP或Perl编写自己的强力验证代码 . 请注意,我的错误消息需要引用存储在父元素中的信息,例如我的示例中的“FirstName”字段 .

我的问题是:创建此验证工具的好方法是什么?是否有任何现有的代码库或教程指向正确的方向?

谢谢!!

回答(1)

3 years ago

您可以想象这是特定于每个XML文件和格式的 .

我将开始使用的第一个问题是确定与验证错误相关的确切元素 . 例如 . 你的错误是

/Person/Location/Latitude

这将是在错误消息中告知特定人(元素)出错的先决条件 .

第二个问题是记录结构的主要构建块 .

例如 . 众所周知,Latitude是Location的一部分,是Person的一部分 . 您需要在某处管理这些知识以提供更好的错误消息 .

我也会这样做,例如输出更友好的错误消息以及更具技术性的错误消息 . 还要注意不要总是解决问题 . 例如 . 如果在输入中为Person提供了错误的标记名,就像人一样,你永远无法将其解析为人性友好的错误消息,因为这是你可以添加的知识 .