posts - 33,comments - 21,trackbacks - 0
          轉貼自賽迪網(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)  編輯  收藏 所屬分類: 編程

          只有注冊用戶登錄后才能發表評論。


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 广汉市| 宁化县| 洞口县| 资溪县| 汽车| 台东市| 开平市| 哈巴河县| 钟祥市| 三穗县| 密云县| 涡阳县| 河南省| 丹寨县| 英吉沙县| 建水县| 且末县| 邳州市| 常宁市| 罗田县| 鹤壁市| 新干县| 蕉岭县| 牟定县| 安远县| 镇江市| 姚安县| 兴化市| 贵南县| 汉寿县| 普宁市| 疏附县| 确山县| 武邑县| 通江县| 博客| 保德县| 汕头市| 大理市| 丰台区| 宁安市|