簡體   English   中英

如何判斷XML文檔是否針對DTD或XSD進行驗證?

[英]How to tell whether an XML document validates against a DTD or XSD?

在Java中,我可以使用javax.xml.validation.Validator針對XSD架構驗證XML文檔,或者通過使用org.xml.sax.XMLReader解析文檔來針對DTD驗證XML文檔。

我需要的是一種以編程方式確定文檔本身是否針對DTD(即它包含<!DOCTYPE ...>語句)或XSD進行驗證的方法。 理想情況下,我需要這樣做而不將整個XML文檔加載到內存中。 有人可以幫忙嗎?

(或者,如果有驗證Java中的XML文檔,對於這兩種的XSD和DTD工作的一個方式-可定制解決資源-這將是更加美好!)

非常感謝,

一種

請參閱javax.xml.validation的包描述。 它包含有關驗證XSD和DTD的信息和示例

確定如何驗證任意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解析器很適合這個 - 因為它是一個pull機制,你可以只讀取文件的開頭然后退出第一個元素的解析。

鏈接到更多相同和示例代碼和諸如此類的東西。

你能用字符串比較嗎?

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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM