JAVA DOM **DTD**XML

Download Report

Transcript JAVA DOM **DTD**XML

銘傳大學資訊工程學系 王豐緒
為何需要驗證XML文件

資訊系統在處理XML文件之前,往往先
須確認該文件是否合乎已知的文件架構規
範
訂
單
訂單
資料
庫
電腦訂單處理
系統
Internet
訂
單
電腦
訂單
架構
DTD文件
XML文件
服飾
下單
系統
如何指定XML文件的驗證來源(一)

將DTD文件寫在XML文件之內
 此法方便XML文件與DTD文件的發展時期,
但較不適合於實務的操作
 可用IE瀏覽器或XMLSPY等進行人工驗證
 可用JAVA DOM 進行自動驗證
<?xml version=“1.0” >
<!DOCTYPE order [
<!ELEMENT order (customer, product*,date_time) >
……
]>
<order>
<customer> ….</customer>
<product> …. </product>
<date_time> …. </date_time>
</order>
XML 文件
JAVA
程式
如何指定XML文件的驗證來源(二)

獨立撰寫DTD文件
 此法較適合於實務的操作
 可用IE瀏覽器或XMLSPY等進行驗證
 可用JAVA DOM 進行自動驗證
XML文件
<?xml version=“1.0” >
<!DOCTYPE order SYSTEM “order.dtd” >
<order>
<customer> ….</customer>
<product> …. </product>
<date_time> …. </date_time>
</order>
<!ELEMENT order (customer, product*,date_time) >
……
DTD文件: order.dtd
JAVA
程式
如何指定XML文件的驗證來源(三)

在執行時期利用JAVA DOM指定DTD文件
 此法最適合於實務的操作
JAVA
程式
<?xml version=“1.0” >
<order>
<customer> ….</customer>
<product> …. </product>
<date_time> …. </date_time>
</order>
XML 文件
<!ELEMENT order (customer, product*,date_time) >
……
DTD文件: order.dtd
JAVA程式(一)

當XML文件內含DTD的相關資訊時(不管
是內部DTD還是外部DTD)
public void ValidateXMLDoc()
{
try {
//1. 產生DocumentBuilderFactory物件
DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
dfactory.setValidating(true); //啟動validating處理機制
//2. 產生DocumentBuilder物件
DocumentBuilder blder = dfactory.newDocumentBuilder() ;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
//3. parse XML文件
Document doc = blder.parse(new File (“XXXX.xml") ); //掃描錯誤會丟出錯誤
System.out.println("XML 文件驗證成功!");
}
catch ( SAXParseException e ) {
System.err.println( "Parse error: " + e.getMessage() );
System.exit( 1 );
}
catch ( SAXException e ) {
System.err.println( "Other Parse error: " + e.getMessage() );
System.exit( 1 );
}
catch ( FileNotFoundException e ) {
System.err.println( "File not found. " );
System.exit( 1 );
}
catch ( Exception e ) {
e.printStackTrace();
}
}
JAVA程式(一)(續)

捕捉剖析過程中的錯誤
 利用自己的錯誤處理程式
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
//2. 產生DocumentBuilder物件
import org.xml.sax.SAXParseException;
DocumentBuilder blder = dfactory.newDocumentBuilder() ;
public class YourErrorHandler implements ErrorHandler
//自己的錯誤處理類別程式
{
blder.setErrorHandler(new YourErrorHandler() ) ;
// 處理致命錯誤
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;
}
}
JAVA程式(二)

當XML文件不含任何DTD的相關資訊時
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.*;
Public void doValidate() {
try{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
DocumentBuilder builder = factory.newDocumentBuilder();
//先載入XML文件
Document xmlDocument = builder.parse(new FileInputStream("XXXX.xml"));
//準備動作
DOMSource source = new DOMSource(xmlDocument);
StreamResult result = new StreamResult(System.out);
//利用Transformer物件進行驗證
TransformerFactory tf = 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());
}
}
實際操作

在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
 讓使用者可以透過網頁要求進行驗證動作

步驟四:測試系統