100 likes | 282 Views
銘傳大學資訊工程學系 王豐緒. 利用 JAVA DOM 進行 DTD 驗證 XML 文件. 為何需要驗證 XML 文件. 資訊系統在處理 XML 文件之前,往往先須確認該文件是否合乎已知的文件架構規範. 訂單. 訂單資料庫. Internet. 服飾下單系統. 電腦訂單處理系統. 訂單. XML 文件. 電腦訂單架構. DTD 文件. 如何指定 XML 文件的驗證來源 ( 一 ). 將 DTD 文件寫在 XML 文件之內 此法方便 XML 文件與 DTD 文件的發展時期,但較不適合於實務的操作 可用 IE 瀏覽器或 XMLSPY 等進行人工驗證
E N D
銘傳大學資訊工程學系 王豐緒 利用JAVA DOM 進行DTD驗證XML文件
為何需要驗證XML文件 • 資訊系統在處理XML文件之前,往往先須確認該文件是否合乎已知的文件架構規範 訂單 訂單資料庫 Internet 服飾下單系統 電腦訂單處理系統 訂單 XML文件 電腦訂單架構 DTD文件
如何指定XML文件的驗證來源(一) • 將DTD文件寫在XML文件之內 • 此法方便XML文件與DTD文件的發展時期,但較不適合於實務的操作 • 可用IE瀏覽器或XMLSPY等進行人工驗證 • 可用JAVADOM 進行自動驗證 <?xml version=“1.0” > <!DOCTYPE order [ <!ELEMENT order (customer, product*,date_time) > …… ]> <order> <customer> ….</customer> <product> …. </product> <date_time> …. </date_time> </order> JAVA程式 XML 文件
如何指定XML文件的驗證來源(二) • 獨立撰寫DTD文件 • 此法較適合於實務的操作 • 可用IE瀏覽器或XMLSPY等進行驗證 • 可用JAVADOM 進行自動驗證 XML文件 <?xml version=“1.0” > <!DOCTYPE order SYSTEM“order.dtd” > <order> <customer> ….</customer> <product> …. </product> <date_time> …. </date_time> </order> JAVA程式 <!ELEMENT order (customer, product*,date_time) > …… DTD文件:order.dtd
如何指定XML文件的驗證來源(三) • 在執行時期利用JAVADOM指定DTD文件 • 此法最適合於實務的操作 JAVA程式 <?xml version=“1.0” > <order> <customer> ….</customer> <product> …. </product> <date_time> …. </date_time> </order> <!ELEMENT order (customer, product*,date_time) > …… DTD文件:order.dtd XML 文件
JAVA程式(一) • 當XML文件內含DTD的相關資訊時(不管是內部DTD還是外部DTD) public void ValidateXMLDoc() { try { //1. 產生DocumentBuilderFactory物件 DocumentBuilderFactorydfactory= DocumentBuilderFactory.newInstance(); dfactory.setValidating(true); //啟動validating處理機制 //2. 產生DocumentBuilder物件 DocumentBuilderblder = dfactory.newDocumentBuilder() ; //3. parse XML文件 Document doc=blder.parse(new File (“XXXX.xml") ); //掃描錯誤會丟出錯誤 System.out.println("XML 文件驗證成功!"); } catch ( SAXParseExceptione ) { System.err.println( "Parse error: " + e.getMessage() ); System.exit( 1 ); } catch ( SAXExceptione ) { System.err.println( "Other Parse error: " + e.getMessage() ); System.exit( 1 ); } catch ( FileNotFoundExceptione ) { System.err.println( "File not found. " ); System.exit( 1 ); } catch ( Exception e ) { e.printStackTrace(); } } import org.w3c.dom.*; import javax.xml.parsers.*; import org.xml.sax.*;
JAVA程式(一)(續) • 捕捉剖析過程中的錯誤 • 利用自己的錯誤處理程式 import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class YourErrorHandler implements ErrorHandler { // 處理致命錯誤 public void fatalError( SAXParseException e ) throws SAXException { System.err.println( "Fatal Error intercepted by Your Error Handler: " + e.getMessage() ); throw e; } // 處理一般錯誤 public void error( SAXParseException e ) throws SAXParseException { System.err.println( "Common Error intercepted by Your Error Handler: " + e.getMessage() ); throw e; } // 處理警告訊息 public void warning( SAXParseException e ) throws SAXParseException { System.err.println( "Warning intercepted by Your Error Handler: " + e.getMessage() ); throw e; } } //2. 產生DocumentBuilder物件 DocumentBuilderblder = dfactory.newDocumentBuilder() ; //自己的錯誤處理類別程式 blder.setErrorHandler(new YourErrorHandler() ) ;
JAVA程式(二) • 當XML文件不含任何DTD的相關資訊時 Public void doValidate() { try{ DocumentBuilderFactoryfactory = DocumentBuilderFactory.newInstance(); factory.setValidating(true); DocumentBuilderbuilder = factory.newDocumentBuilder(); //先載入XML文件 Document xmlDocument = builder.parse(new FileInputStream("XXXX.xml")); //準備動作 DOMSourcesource = new DOMSource(xmlDocument); StreamResultresult = new StreamResult(System.out); //利用Transformer物件進行驗證 TransformerFactorytf= TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "YYYY.dtd"); transformer.transform(source, result); } catch (Exception e) { System.out.println(e.getMessage()); } } import org.w3c.dom.*; import org.xml.sax.*; import javax.xml.parsers.*; import javax.xml.validation.*; import javax.xml.transform.*; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.*;
實際操作 • 在Tomcat下佈署可以驗證XML文件架構的實例 • 請參閱線上教材:JavaServelt附錄之Hello範例 • (http://mm.tlrc.mcu.edu.tw/courses/fhwang/XML/Marterial/Appendix_JAVAServlet/Samples/Sample1/Hello.java) • (http://mm.tlrc.mcu.edu.tw/courses/fhwang/XML/Marterial/Appendix_JAVAServlet/Samples/Sample1/Sample1.rar) • JAVA1程式範例 • http://moodle-06.mcu.edu.tw/mod/resource/view.php?id=11898 • JAVA2程式範例 • http://moodle-06.mcu.edu.tw/mod/resource/view.php?id=11897
示範(一) • 步驟一:修改Hello.java成為ValidateDTD.java • 沿用其HttpServlet架構 • 加入驗證XML的程式碼 • 步驟二:佈署ValidateDTD.java • 包括修改web.xml檔案, 新增Validate功能 • 步驟三:修改Hello.htm成為Validate.htm • 讓使用者可以透過網頁要求進行驗證動作 • 步驟四:測試系統