參考資料:
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實現驗證的代碼: ??XMLErrorHandler errorHandler = new XMLErrorHandler(); 3.對上述代碼的注釋: 主要思路:設置SAXReader支持驗證 -〉得到xsd文件的路徑 -〉讀入要驗證的xml文件 -〉OK!; 驗證流程: -〉設置支持驗證; -〉設置支持驗證的幾個feature的值; -〉設置xsd文件路徑的Property值,這樣就可以依據xsd文件進行驗證了; -〉讀入要驗證的.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; ? 法二:
-〉xml validation is ok! 二.內容補充: 參考資料“DOM4J 驗證XML Schema (我要的成功 的blog) 這段代碼是關于實體解析器用來解析外部實體引用的,在這里并不需要。 注釋: 2.關于實體解析器如何使用,詳見資料:
?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("
??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;
?}
SAXReader reader = new SAXReader();
reader.setValidation(true);
注明:SAXReader的各個函數的作用和用法詳見dom4j api doc。
語法格式:public void setProperty(java.lang.String name,java.lang.Object value)
byte[] xmlMsgBytes =xmldescription.getBytes();
……
InputStream in = new ByteArrayInputStream(xmlMsgBytes);
InputStream in=TAEncodeDecoderFactory.class.getResourceAsStream("encoder_decoder_mapping.xml");
-〉這樣SAXReader就可以根據xsd文件對所讀入的xml信息進行驗證了!
-〉接下來,還可以使用XMLErrorHandler和XMLWriter這兩個類在控制臺輸出錯誤提示信息;
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
技巧:使用實體解析器
http://www-128.ibm.com/developerworks/cn/xml/tips/x-tipent/index.html
三.尚未解決的問題:
如何獲取xml相對路徑?