名字空間在XML中的應用
我們可能都編寫過下面這種簡單的XML文檔:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
<?xml version="1.0" encoding="gb2312"?>
<數據結構課程>
<老師>
<職稱>教授</職稱>
<姓名>張老師</姓名>
<電話>98989988</電話>
</老師>
</數據結構課程>
我們可以發現上面的XML文檔元素是比較少的,結構也相對來說比較簡單,比較好實現,但當我們想把這個結構做的更復雜一些,比如說再加上是哪個學校開的這門課,又是哪個系開的這門課等等時,只好再通過增加元素來解決,這樣一來就必須得增加層次結構,很不方便。那麼有什麼辦法可以解決這個問題嗎?
答案是有,我們可以通過名字空間來解決這個問題。
那麼可能有人會問:“什麼是名字空間啊?”。名字空間的英文名字是namespace,顧名思義也就是允許你通過一個網址指向來識別你的標籤。例如:
<大學:老師 xmlns:大學="http://www.beihang.com">
其中xmlns是XHTML namespace的縮寫,叫做"名字空間"聲明。
爲什麼要使用名字空間呢?因爲我們都知道xml是允許我們自定義標籤的,這樣就有可能我們定義的標籤和其他人定義的標籤相同,但表示的意義可能不同。當文件交換或者共享的時候就容易產生錯誤。
比如說張三和李四都定義了一個<學校>的標籤,張三的<學校>標籤指的是北航,李四的<學校>標籤指的是西工大,那麼當兩個文檔交換數據時,就無法分清這個<學校>標籤到底指的是西工大還是北航,這樣就會出問題了。爲了避免這種錯誤發生,XML採用名字空間聲明,允許你通過一個網址指向來識別你的標籤。例如張三的<學校>標籤的名字空間是"http://www.beihang.com",李四的<學校>標籤名字空間是"http://www.xigongda.com" 。
那麼如何通過名字空間來實現下面的XML文檔呢?
<?xml version="1.0" encoding="gb2312"?>
<大學:老師 xmlns:大學="http://www.beihang.com">
<老師:數據結構課程 xmlns:老師="http://www.beihang.com/computer/zhang">
<老師:職稱>教授</老師:職稱>
<老師:姓名>張老師</老師:姓名>
<老師:電話>98989988</老師:電話>
</老師:數據結構課程>
</大學:老師>
源程序如下:
package xml_study;
import org.jdom.*;
import org.jdom.output.XMLOutputter;
import java.math.BigInteger;
import java.io.IOException;
public class PrefixedFibonacci {
public PrefixedFibonacci() {
}
public static void main(String[] args){
Element root = new Element("老師","大學","http://www.beihang.com");
//指的是北航的張老師
Element mrow = new Element("數據結構課程","老師","http://www.beihang.com/computer/zhang"); //指的是北航計算機系的張老師
Element mi = new Element("職稱","老師","http://www.beihang.com/computer/zhang");
mi.setText("教授");
mrow.addContent(mi);
Element mo = new Element("姓名","老師","http://www.beihang.com/computer/zhang");
mo.setText("張老師");
mrow.addContent(mo);
Element mm = new Element("電話","老師","http://www.beihang.com/computer/zhang");
mm.setText("98989988");
mrow.addContent(mm);
root.addContent(mrow);
Document doc = new Document(root);
try{
XMLOutputter serializer = new XMLOutputter(" ",true);
serializer.setEncoding("gb2312");
serializer.output(doc,System.out);
}
catch(IOException e){
System.err.print(e);
}
}
}
該程序在Jbuilder9,Tomcat4.0下運行成功。
名字空間的基本JDOM規則是:當元素或屬性在名字空間中而不是指定完全限定名是,要依次指定本地名,前綴和URI。如果元素在默認名字空間中,則省略前綴。