[英]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.