在 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.");
    }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top