如何判断 XML 文档是否根据 DTD 或 XSD 进行验证?
-
20-08-2019 - |
题
在 Java 中,我可以使用 javax.xml.validation.Validator 根据 XSD 模式验证 XML 文档,或者通过使用 org.xml.sax.XMLReader 简单地解析文档来根据 DTD 验证 XML 文档。
但我需要的是一种以编程方式确定文档本身是否针对 DTD 进行验证的方法(即它包含一个 <!DOCTYPE ...>
声明)或 XSD。理想情况下,我需要在不将整个 XML 文档加载到内存中的情况下执行此操作。有人可以帮忙吗?
(或者,如果有 单身的 在 Java 中验证 XML 文档的方法,该方法适用于 XSD 和 DTD - 并允许自定义资源解析 - 这会更好!)
非常感谢,
A
解决方案
没有 100% 万无一失的过程来确定如何验证任意 XML 文档。
比如这个2.4版本 Web 应用程序部署描述符 指定一个 W3架构 验证文档:
<?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">
放松NG 似乎没有提供的机制 任何 文档中提示您应该使用它。验证机制是由文档使用者而不是生产者决定的。如果我没记错的话,这是推动从 DTD 转向更现代的验证机制的推动力之一。
在我看来,最好的选择是根据您正在处理的文档类型集定制机制检测器,读取标题信息并根据需要对其进行解释。这 StAX解析器 对此很有好处 - 因为它是一种拉机制,您可以只读取文件的开头,然后退出对第一个元素的解析。
其他提示
请参阅用于包描述javax.xml.validation中。它包含有关信息和示例用于验证两者的XSD和DTD
你能不能用字符串比较?
public enum Type {
XSD,
DTD,
UNKNOWN
};
public Type findType(File f) throws FileNotFoundException, IOException {
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(f));
String line;
// may want to cut this loop off after a certain number of lines
while ((line = reader.readLine()) != null) {
line = line.toLowerCase();
if (line.contains("<!doctype"))
return Type.DTD;
else if (line.contains("xsi:schemaLocation"))
return Type.XSD;
}
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException ex) {}
}
}
return Type.UNKNOWN;
}
可能你也许张贴您如何验证对一个给定的DTD的XML的代码示例。这似乎是容易的模式,但我在努力寻找如何用DTD做。
非常感谢,
丹尼斯。
好,我发现它:
XMLReader reader = XMLReaderFactory.createXMLReader();
// try to activate validation
try {
// Turn on validation
reader.setFeature("http://xml.org/sax/features/validation", true);
// Ensure namespace processing is on (the default)
reader.setFeature("http://xml.org/sax/features/namespaces", true);
} catch (SAXException e) {
System.err.println("Cannot activate validation.");
}
try {
reader.parse("testFiasRequest.xml");
} catch (IOException e) {
System.err.println("I/O exception reading XML document");
} catch (SAXException e) {
System.err.println("XML exception reading document.");
}