首頁  >  文章  >  後端開發  >  XML簡明教學(4)

XML簡明教學(4)

黄舟
黄舟原創
2017-02-18 15:30:101614瀏覽

目錄


發展歷史

XML和HTML對比之可擴展

XML驗證之DTD

XML

語法結構XML

命名空間DOM4J

如前面教程中所說的那樣,XML的最大作用在於儲存、傳輸以及交換資料。在這段期間XML的正確性至關重要,為了確保XML的正確性人們採取了相應的措施。

XML的正確性分為兩方面:一方面是XML的語法,一方面是XML的內容。人們把擁有正確語法的XML 被稱為「形式良好」的XML,對於一個形式良好的XML文檔,我們只能保證這個文檔的格式符合XML規範,換句話說就是保證XML在語法上沒有錯誤,但是元素與元素的關係,屬性的值是否正確,這些都無法得知。對於一個形式良好的文檔,如果僅僅是在有限的應用中使用,例如自己開發的系統中當作配置文件,或者作為數據的存儲傳輸,也許能夠很好的滿足我們的應用。但如果要讓其他使用者理解或系統也能運用你的XML文檔,或是進行資料交換,那麼必須保證XML為「合法」的。這樣就有必要提供一種驗證XML機制,目的就是用來確保我們所寫的XML文檔和別人所寫的XML文檔其結構是相同的,元素與元素之間的關係是正確的,屬性的取值是符合要求的。

這種機制在XML標準中已經為我們提供了,也就是我們前面提到的DTD(Document Type Definition,文檔類型定義)。換句話說透過 DTD 可以驗證的自己的XML 是否為「合法」的 XML。


我們可以直接在XML文件中定義DTD,也可以透過URI引入外部的DTD檔案。內部的DTD雖然方便,但是會導致文件本身長度增加傳輸負擔,而且如果多個XML文件要共用一個DTD我們就需要在每一個文件中加入DTD,這是相當繁瑣的。所以建議的做法是將DTD放到一個單獨的檔案去定義,在XML文件中透過URI去引用外部的DTD檔。


下面就示範如何用DTD檔案來驗證XML檔案的合法性

test.xml檔案程式碼

<?xml version="1.0" encoding="gb2312" standalone="no"?>
<!DOCTYPE student SYSTEM "test.dtd">
<!--这是XML文档-->
<student>
	<name>张三</name>
	<age>24</age>
</student>



代码解析:在第二行中将外部的DTD文档引入,用于判断XML是否合法。其中用的路径为相对路径,网上很多XML中引入的DTD是一个URI,无论是相对还是绝对的路径,总之只要XML能找到其对应的DTD就是可行的。

test.dtd文件代码

<!ELEMENT student (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST student sex (man | woman) &#39;man&#39;>



代码解析:第一行至第三行定义了XML文件中的元素,以及元素之间的关系。在第四行定义了student属性中对sex的限制内容,其默认为man而且只能选取两个值man或者woman。

下面开始验证XML的合法性:



package ValidateXml;

import java.io.FileNotFoundException;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class ValidateXMLDTD {
    
    public static void main(String[] args) {
//       test1XML();
       test2XML();
    }
    
    public static void test1XML() {
        try {
        	InputSource ips=new InputSource();
        	ips.setSystemId("d:\\test.xml");
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            dbf.setValidating(true);
            DocumentBuilder db = dbf.newDocumentBuilder();
            db.parse(ips);
        System.out.println("xml 正确!");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public static void test2XML() {
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            dbf.setValidating(true);
            DocumentBuilder db = dbf.newDocumentBuilder();
            db.parse(new java.io.FileInputStream("d:\\test.xml"));
        System.out.println("xml 正确!");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



代码解析:上面的代码验证XML是否为合法,需要注意的是不要直接将XML读入到输入流中,那样的话会找不到相对路径下的DTD,调用test2XML会报错如下,如果调用test1XML则会正确验证XML。

直接用输入流读入的话XML寻找相对路径会在eclipse的环境下进行寻找DTD,如果用setSystemId进行设置的话会根据XML自己存在的目录中寻找DTD(参看具体解释),很显然后一种方式才是我们想要的。

通过DTD我们可以很容易的判断要验证的XML是否符合我们所定义的规范(元素之间的关系,属性的取值是否正确)但是如果要验证元素的内容DTD就无能为力了,于是人们研究了新的验证方法——Schema。就像人们远行一样,当对时间要求不苛刻的时候,火车便宜而且安全;当对时间有严格要求的时候,飞机也是不错的选择。根据实际需要改进技术,根据实际需要选择技术。量体裁衣,明智之举。

 以上就是XML简明教程(4) 的内容,更多相关内容请关注PHP中文网(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:XML簡明教學(3)下一篇:XML簡明教學(3)