【发布时间】:2019-09-24 11:27:29
【问题描述】:
我正在使用以下代码创建一个 DOMDocument 并根据外部 xsd 文件对其进行验证。
<?php
$xmlPath = "/xml/some/file.xml";
$xsdPath = "/xsd/some/schema.xsd";
$doc = new \DOMDocument();
$doc->loadXML(file_get_contents($xmlPath), LIBXML_NOBLANKS);
if (!$doc>schemaValidate($xsdPath)) {
throw new InvalidXmlFileException();
}
更新 2(重写问题)
这很好用,这意味着如果 XML 与 XSD 的定义不匹配,它将抛出一个有意义的异常。
现在,我想使用 Xpath 从 DOMDocument 中检索信息。它也可以正常工作,但是,从这一点开始,DOMDocument 与 XSD 完全分离!例如,如果我有一个DOMNode,我不知道它是simpleType 类型还是complexType 类型。我可以检查该节点是否有子 (hasChild()) 节点,但这不一样。此外,XSD 中还有大量信息(例如,最小和最大出现次数等)。
问题真的是,我是否必须自己查询 XSD,或者是否有编程方式来询问这类问题。 IE。 DOMNode 是复杂类型还是简单类型?
在another post 中建议“使用真正的模式处理器处理模式,然后使用它的 API 来询问有关模式内容的问题”。 XPath 是否有 API 来检索 XSD 的信息,或者是否有与 DOMDocument 不同的便捷方式?
记录一下,原来的问题
现在,我想继续使用 XPath 解析来自 DOMDocument 的信息。为了提高我存储到数据库中的数据的完整性并向客户端提供有意义的错误消息,我希望不断使用模式信息来验证查询。 IE。我想根据 xsd 中定义的允许子节点验证获取的子节点。我想通过在 xsd 文档上使用 XPath 来实现。
但是,我偶然发现了this post。它基本上说这是你自己的一种古怪方式,你应该使用真正的模式处理器并使用它的 API 来进行查询。如果我理解正确的话,我正在使用带有schemaValidate 的真正模式处理器,但是使用它的 API 意味着什么?
我已经猜到我没有以正确的方式使用架构,但我不知道如何研究正确的用法。
问题
如果我在 DOMDocument 上使用 schemaValidate 是一次性验证(真或假)还是与 DOMDocument 绑定更长时间?准确地说,我是否可以使用验证也以某种方式添加节点,或者我可以使用它来选择我感兴趣的节点,正如引用的 SO 帖子所建议的那样?
更新
这个问题被评为不清楚,所以我想再试一次。假设我想添加一个节点或编辑一个节点值。我可以使用 xsd 中提供的模式来验证用户输入吗?最初,为了做到这一点,我想使用另一个 XPath 实例手动查询 xsd 以获取某个节点的规范。但正如链接文章中所建议的,这不是最佳实践。所以问题是,DOM 库是否提供任何 API 来进行此类验证?
也许我想多了。也许我只是添加节点并再次运行验证,看看它在哪里/为什么会中断?在这种情况下,自定义错误处理的答案将是正确的。你能确认一下吗?
【问题讨论】:
标签: php xml xsd domdocument xml-validation