參考資料:
dom4j API DOC (到SourceForge.net 上下載dom4j-1.6.1.zip,下載后就會在里面找到doc了)

dom4j 和 xerces-2.4.0 利用schema驗證xml問題
http://www2.matrix.org.cn/thread.shtml;jsessionid=E282E65FCE68F3A4D25B0962DCE6F813?topicId=45719&forumId=13

DOM4J 驗證XML Schema (我要的成功 的blog)
http://kingofhawks.spaces.live.com/?_c11_BlogPart_blogpart=blogview&_c=BlogPart&partqs=cat%3d%25e8%25ae%25a1%25e7%25ae%2597%25e6%259c%25ba%25e4%25b8%258e%2bInternet

Xerces-Java 2 中的 XML Schema 驗證 (登錄:jchunmei19@126.com/05602050)
http://www-128.ibm.com/developerworks/cn/views/xml/tutorials.jsp?cv_doc_id=84985

?

xsd驗證

一.java中如何使用dom4j的SAXReader實現驗證.

1.xml驗證用于驗證符合xml語法格式的xml文件是否符合特定的xml Schema以及數據類型等,xml驗證主要有兩種方式,DTD和XSD,現采用的是XSD方式。xsd文件的語法格式和編寫參考“xsd學習筆記”這篇,現在介紹準備好了xsd文件之后,java中如何使用dom4j的SAXReader實現驗證。下面進入正文:

2.任何技術的介紹,代碼都是最直觀的,下面就來直接看SAXReader實現驗證的代碼:
?public static boolean isXmlOK(String xsdFile, byte[] tagetXml) throws SAXException, IOException, DocumentException
?{
??boolean flag = true;
??SAXReader reader = new SAXReader();
??reader.setValidation(true);
??
??reader.setFeature("??reader.setFeature("??reader.setProperty("??//reader.setProperty("

??XMLErrorHandler errorHandler = new XMLErrorHandler();
??reader.setErrorHandler(errorHandler);
??InputStream in = new ByteArrayInputStream(tagetXml);
??InputStreamReader utf8In=new InputStreamReader(in,"utf-8");
??//Document document = reader.read(in);
??reader.read(utf8In);
??XMLWriter writer = new XMLWriter(OutputFormat.createPrettyPrint());
??if (errorHandler.getErrors().hasContent()) {
???flag = false;
????? //writer.write(errorHandler.getErrors());
??} else {
????? System.out.println("Xml is OK!.");
??}
??return flag;
?}

3.對上述代碼的注釋:

主要思路:設置SAXReader支持驗證 -〉得到xsd文件的路徑 -〉讀入要驗證的xml文件 -〉OK!;

驗證流程:

-〉設置支持驗證;
SAXReader reader = new SAXReader();
reader.setValidation(true);

-〉設置支持驗證的幾個feature的值;
注明:SAXReader的各個函數的作用和用法詳見dom4j api doc。

-〉設置xsd文件路徑的Property值,這樣就可以依據xsd文件進行驗證了;
語法格式:public void setProperty(java.lang.String name,java.lang.Object value)

-〉讀入要驗證的.xml文件或xml格式的字符串;

*若驗證的是.xml文件,則reader.read(param)中的param為xml文件的路徑,這個xml文件的路徑應該設置為相對路徑;(xml相對路徑如何獲取和表示這個問題有待解決)

*若驗證的是字符串,則要把字符串轉換為InputStream類型,這是read方法的參數要求。(詳見dom4j api doc)

那么怎么把字符串轉換為InputStream類型呢?

法一:

我們知道,ByteArrayInputStream(byte[] buf)方法可以使byte字節碼轉為InputStream流,那么我們先通過getBytes()方法把字符串轉為byte[]類型,再通過ByteArrayInputStream(byte[] buf)方法轉為InputStream流就ok了!

String xmldescription = (String) obj; ?
byte[] xmlMsgBytes =xmldescription.getBytes();
……
InputStream in = new ByteArrayInputStream(xmlMsgBytes);

法二:
InputStream in=TAEncodeDecoderFactory.class.getResourceAsStream("encoder_decoder_mapping.xml");


-〉這樣SAXReader就可以根據xsd文件對所讀入的xml信息進行驗證了!


-〉接下來,還可以使用XMLErrorHandler和XMLWriter這兩個類在控制臺輸出錯誤提示信息;

-〉xml validation is ok!

二.內容補充:

參考資料“DOM4J 驗證XML Schema (我要的成功 的blog)
http://kingofhawks.spaces.live.com/?_c11_BlogPart_blogpart=blogview&_c=BlogPart&partqs=cat%3d%25e8%25ae%25a1%25e7%25ae%2597%25e6%259c%25ba%25e4%25b8%258e%2bInternet”中提到“如何讀取Class path下的xsd文件:需要實現EntityResolver 接口,在resolveEntity()中讀取當前類路徑下的xsd文件,并返回InputSource instance.”的問題,下面談談對EntityResolver的理解:

這段代碼是關于實體解析器用來解析外部實體引用的,在這里并不需要。

注釋:
1.關于什么是實體,什么是外部實體,詳見資料:
xml實用大全
http://phpso.com/data/htm/XML/408.htm

2.關于實體解析器如何使用,詳見資料:
技巧:使用實體解析器
http://www-128.ibm.com/developerworks/cn/xml/tips/x-tipent/index.html


三.尚未解決的問題:
如何獲取xml相對路徑?