如何判断XML文档是否针对DTD或XSD进行验证?

时间:2009-01-30 17:17:27

标签: java xml validation xsd dtd

在Java中,我可以使用javax.xml.validation.Validator针对XSD架构验证XML文档,或者通过使用org.xml.sax.XMLReader解析文档来针对DTD验证XML文档。

我需要的是一种以编程方式确定文档本身是否针对DTD(即它包含<!DOCTYPE ...>语句)或XSD进行验证的方法。理想情况下,我需要这样做而不将整个XML文档加载到内存中。有人可以帮忙吗?

(或者,如果有一种单一方式验证Java中适用于XSD和DTD的XML文档 - 并允许自定义资源解析 - 那就更好了!)

非常感谢,

A

4 个答案:

答案 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对此有好处 - 因为它是一个拉机制,你只需读取文件的开头然后退出解析第一个元素。

Link to more of the same and sample code and whatnot.

答案 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.");
    }