在Java中,我可以使用javax.xml.validation.Validator针对XSD架构验证XML文档,或者通过使用org.xml.sax.XMLReader解析文档来针对DTD验证XML文档。
我需要的是一种以编程方式确定文档本身是否针对DTD(即它包含<!DOCTYPE ...>
语句)或XSD进行验证的方法。理想情况下,我需要这样做而不将整个XML文档加载到内存中。有人可以帮忙吗?
(或者,如果有一种单一方式验证Java中适用于XSD和DTD的XML文档 - 并允许自定义资源解析 - 那就更好了!)
非常感谢,
A
答案 0 :(得分:1)
请参阅javax.xml.validation的包描述。它包含有关验证XSD和DTD的信息和示例
答案 1 :(得分:1)
确定如何验证任意XML文档没有100%的万无一失的过程。
例如,此版本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对此有好处 - 因为它是一个拉机制,你只需读取文件的开头然后退出解析第一个元素。
答案 2 :(得分:0)
你能使用字符串比较吗?
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;
}
答案 3 :(得分:0)
您是否可以发布一个代码示例,说明如何针对给定的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.");
}