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

时间:2013-04-09 21:08:24

标签: php xml validation xsd

我正在尝试构建一个用于验证特定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 个答案:

答案 0 :(得分:1)

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

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

/Person/Location/Latitude

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

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

E.g。众所周知 Latitude 位置的一部分,位置 Person 的一部分。您需要在某处管理这些知识以提供更好的错误消息。

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