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