4

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

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

(或者,如果有一种Java 中验证 XML 文档的方法既适用于 XSD 也适用于 DTD - 并且允许自定义资源解析 - 那会更好!)

非常感谢,

一种

4

4 回答 4

1

请参阅javax.xml.validation的包说明。它包含有关验证 XSD 和 DTD 的信息和示例

于 2009-01-30T17:45:11.040 回答
1

没有确定如何验证任意 XML 文档的 100% 万无一失的过程。

例如,这个 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">

RELAX NG似乎没有在文档中提供任何提示您应该使用它的机制。验证机制由文档消费者而非生产者决定。如果我没记错的话,这是推动从 DTD 转向更现代的验证机制的动力之一。

在我看来,最好的办法是根据您正在处理的文档类型集定制机制检测器,读取标题信息并酌情解释它。StAX 解析器对此很有用——因为它是一种拉机制,您可以只读取文件的开头,然后在第一个元素上退出解析。

链接到更多相同和示例代码等等。

于 2009-02-21T14:08:03.567 回答
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;
}
于 2009-01-30T22:44:19.203 回答
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.");
    }
于 2009-02-10T14:56:43.773 回答