轉貼自賽迪網(
http://tech.ccidnet.com/art/294/20021120/31320_2.html)
如果一個XML文檔符合上述文檔所表現出來的一些特征,即可稱之為良構的XML文檔。這些特征如下:
1. 每個元素必須有起始和結束標記;
2. 文檔只有一個根元素;
3. 正確地對空元素進行格式化;
4. 開始和結束標注必須匹配(區分大小寫);
5. 元素必須正確地嵌套;
6. 屬性值必須用引號括起來。
IsXMLAvailable.java 是用于進行XML文檔良構檢驗的Java程序,代碼如下:
//IsXMLAvailable.java
import java.io.File;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;
public class IsXMLAvailable{
public static void main(String argv[]){
if (argv.length!=1){
System.out.println("參數錯誤!");
System.exit(1);
}
try{
//取得工廠類的一個新實例
DocumentBuilderFactory dbf=
DocumentBuilderFactory.newInstance();
//通過靜態方法創建DocumentBuilder 實例
//準備建立Document 對象
DocumentBuilder db=dbf.newDocumentBuilder();
//建立XML 文檔對象
Document doc=db.parse(new File(argv[0]));
//格式化文檔
doc.getDocumentElement().normalize();
System.out.println("XML 文件結構正確!");
}
catch(SAXParseException e){
//錯誤提示,SystemID 為全路徑的文件名
System.out.println("XML 在第" +
e.getLineNumber()+"行出錯異常,文件信息:"+e.getSystemId());
System.out.println("\n"+e.getMessage());
}
catch(SAXException ex){
ex.printStackTrace();
}
catch(Throwable th){
th.printStackTrace();
}
}
} |
運行“java IsXMLAvailable People.xml”命令,如程序出錯,則顯示第幾行有錯,并給出可能的錯誤提示;如程序正確,則顯示 “XML 文件結構正確!”
建立一個有效的XML 文檔(DTD)及驗證的實例良好的XML 文檔只說明了其語法正確,并沒有解決語義問題。XML 描述了有一定含義的數據,其中可以指定包含數據的規則。通過這種指定的規則,可以驗證已聲明符合規則的XML 文檔的有效性,即DTD——文檔類型定義。
DTD 可以確保應用程序接收到一個有效的XML 文檔,然后可以針對某一類XML 設計出應用程序接口。這樣符合某種DTD 的XML 文檔都可以被應用程序解析,也可以用DTD 制定自己的文檔規則,而這個規則可被其它應用程序利用。DTD 有兩種方法聲明XML文件:
(1) 外部 DTD 聲明如下:
<!DOCTYPE peopleinfo SYSTEM "People.dtd"> |
(2) 內部 DTD 聲明(PeopleDTD.xml)如下:
<? xml version="1.0" encoding="GB2312"?>
<! DOCTYPE PeopleInfo[
<! ELEMENT PeopleInfo(People+)>
<!ELEMENT People(Peoplename, PeopleSex,PeopleAge)>
<! ELEMENT PeopleName(#PCDATA)>
<! ELEMENT PeopleSex(#PCDATA)>
<! ELEMENT PeopleAge(#PCDATA)>
<! ATTLIST People PeopleId CDATA #REQUIRED>
]>
<PeopleInfo>
<People PeopleId="YOUR">
<PeopleName> 古董 </PeopleName>
<PeopleSex> 男 </PeopleSex>
<PeopleAge> 23 </PeopleAge>
</People>
<People PeopleId="SHEN">
<PeopleName> 王冠 </PeopleName>
<PeopleSex> 女 </PeopleSex>
<PeopleAge> 25 </PeopleAge>
</People>
</PeopleInfo> |
從上面的文件可以看到內嵌的DTD 在
<! DOCTYPE> 標記中。首先聲明的是XML 文檔的根元素
<PeopleInfo>,然后指明在
<PeopleInfo>根元素中必須包含有一個或是多個的
<People>元素(用People+ 表示)。下一句定義了在
<People>元素中必須包含
<PeopleName>、<PeopleSex>和<PeopleAge>3個元素。這3個元素的內容類型為#PCDATA,表示內容為文本類型。然后是對屬性的定義,表示PeopleInfo 必須含有PeopleId 屬性。#REQUIRED(必須含有)默認的可以省略,CDATA 表示屬性值是字符串型。
要檢驗一個XML 文件是否有效需要在解析XML 文件時檢驗其是否有效。首先在創建DocumentBuilder 對象之前,利用語句設置有效性檢驗,語句如下:
dbf.setValidating(true);//設置對XML 文件進行有效驗證 |
因為SAX 在解析XML 文件時,遇到不符合DTD規定的地方要觸發相應的事件,所以還要在程序中定義實現了事件接口的類。在這里用的是常用的處理事件的靜態內部類,在此類中必須實現的方法語句如下:
public void warning(SAXParseException spe) throws SAXExcepton
public void error(SAXParseException spe) throws SAXExcepton
public void fatalError(SAXParseException spe) throws SAXExcepton |
不同級別的錯誤事件將分別觸發這3個方法中的一個。
在IsXMLAvailableDTD.java 中,提供了對XML 文檔進行有效性檢驗的源程序。從中可以看到SAX事件驅動的解析XML程序的編寫方式http:。
posted on 2006-11-22 17:21
英明 閱讀(223)
評論(0) 編輯 收藏 所屬分類:
編程