2009-01-30 79 views
2

在Java中,我可以使用javax.xml.validation.Validator根據XSD模式驗證XML文檔,或者通過使用org.xml.sax.XMLReader簡單解析文檔來驗證DTD。如何判斷XML文檔是否針對DTD或XSD進行驗證?

我需要的是一種通過編程確定文檔本身是否對DTD(即包含<!DOCTYPE ...>語句)或XSD進行驗證的方式。理想情況下,我需要在不將整個XML文檔加載到內存的情況下執行此操作。任何人都可以幫忙嗎?

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

非常感謝,

+0

我不太確定我是否理解這個問題。你想知道文檔是否真的有效,或者你只是想知道它是使用DTD還是XSD?還是其他什麼東西? – 2009-01-30 18:00:51

+0

第二個 - 我知道如何根據XSD驗證文檔,以及如何根據DTD進行驗證,但是我需要確定使用哪種方法,即文檔是使用DTD還是XSD。感謝您的答覆。 – 2009-01-30 20:30:47

回答

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沒有按」 t似乎有一種機制,在文檔中提供了任何提示,您應該使用它。驗證機制由文件消費者決定,而不是生產者。如果我沒有弄錯,這是推動從DTD轉向更現代驗證機制的動力之一。

在我看來,您最好的選擇是根據您正在處理的文檔類型設置機制檢測器,閱讀標題信息並根據需要進行解釋。 StAX parser對此很有用 - 因爲它是一種拉動機制,您可以只讀取文件的開頭,然後退出對第一個元素的解析。

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

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