在 Java 中,我可以使用 javax.xml.validation.Validator 根据 XSD 模式验证 XML 文档,或者通过使用 org.xml.sax.XMLReader 简单地解析文档来根据 DTD 验证 XML 文档。
但我需要的是一种以编程方式确定文档本身是针对 DTD(即它包含 <!DOCTYPE ...>
语句)还是 XSD 进行验证的方法。理想情况下,我需要在不将整个 XML 文档加载到内存中的情况下执行此操作。有人可以帮忙吗?
(或者,如果有一种单一方法来验证 Java 中的 XML 文档,同时适用于 XSD 和 DTD - 并允许自定义资源解析 - 那会更好!)
非常感谢,
一个
最佳答案
没有 100% 万无一失的过程来确定如何验证任意 XML 文档。
比如这个版本2.4 web application deployment descriptor指定 W3 schema验证文档:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
但是,这是表达同一事物的同样有效的方式:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee">
RELAX NG似乎没有一种机制可以在文档中提供您应该使用它的任何 提示。验证机制由文档消费者决定,而不是生产者。如果我没记错的话,这是插入从 DTD 转向更现代的验证机制的动力之一。
在我看来,最好的办法是根据您正在处理的文档类型集定制机制检测器,读取标题信息并适本地解释它。 StAX parser对此有好处 - 因为它是一种拉式机制,您可以只读取文件的开头,然后退出对第一个元素的解析。
关于java - 如何判断 XML 文档是否针对 DTD 或 XSD 进行验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/496369/