學習java&XML第二天,命名空間
關于XML的基礎知識一直都是讀的http://www1.xml.net.cn/那本初學進階,講的非常容易懂,就是關于命名空間這一塊沒有給出一個比較好的例子,所以自己整理了一下。
初學進階里面說命名空間是用于在一個XML里面引入多個DTD的,的確,概念上是這樣子的,不過網上的資料顯示XML的命名空間并不支持DTD格式的格式定義,也就是說,想實現一個XML當中有多個文檔格式的話,就必須要使用Schema。
先了解一下我們要實現的例子:
client.xml
<聯系人列表>
<聯系人>
<姓名>張三</姓名>
<ID>001</ID>
<公司>A公司</公司>
<EMAIL>zhang@aaa.com</EMAIL>
<電話>(010)62345678</電話>
<地址>
<街道>五街1234號</街道>
<城市>北京市</城市>
<省份>北京</省份>
</地址>
<直接上司>
<姓名>王五</姓名>
<電話>
<秘書電話>(010)62345678</秘書電話>
<手機>13601234567</手機>
</電話>
</直接上司>
</聯系人>
</聯系人列表>
以上是我們想要最終表達的數據格式,其中,聯系人的直接上司屬性有點麻煩,因為整個直接上司表達的是一個“企業經理”的“對象”,該“對象”可以以另外的XML形式體現,如下:
<?xml version="1.0" encoding="GB2312"?>
<企業經理>
<姓名>王五</姓名>
<電話>
<秘書電話>(010)62345678</秘書電話>
<手機>13601234567</手機>
</電話>
</企業經理>

看以上的兩個文檔,實際上就是我們想表達的數據,兩個抽象的實體“聯系人”和“企業經理”之間存在著一對一的關系。
但是我們現在有個麻煩,在聯系人列表這個XML當中,有兩個“姓名”元素和兩個“電話”元素,他們表達的是不同的意思,其文檔格式定義也不同。他們分別對應著不同的DTD或者是Schema。
為了解決這一問題,就有了命名空間的概念,首先,對于我們要最終作用于其上的client.xml,他必須首先區別聯系人和企業經理,做法就是在前面加前綴,比如聯系人的名字改為“聯系人:名字”而企業經理的名字則改為“企業經理:名字”
其次,兩個不同的文檔定義文件必須首先定義好命名空間,在作用于XML文件的時候,使命名空間和XML聲明中的命名空間一致。
下面分別給出例子代碼:
client.xml:
<?xml version="1.0" encoding="GB2312"?>
<聯系人:聯系人列表
xmlns:聯系人="id"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="id client.xsd id2 manager.xsd"
xmlns:企業經理="id2">
<聯系人:聯系人>
<聯系人:姓名>張三</聯系人:姓名>
<聯系人:ID>001</聯系人:ID>
<聯系人:公司>A公司</聯系人:公司>
<聯系人:EMAIL>zhang@聯系人.com</聯系人:EMAIL>
<聯系人:電話>(010)62345678</聯系人:電話>
<聯系人:地址>
<聯系人:街道>五街1234號</聯系人:街道>
<聯系人:城市>北京市</聯系人:城市>
<聯系人:省份>北京</聯系人:省份>
</聯系人:地址>
<聯系人:直接上司>
<企業經理:姓名>王五</企業經理:姓名>
<企業經理:電話>
<企業經理:秘書電話>(010)62345678</企業經理:秘書電話>
<企業經理:手機>13601234567</企業經理:手機>
</企業經理:電話>
</聯系人:直接上司>
</聯系人:聯系人>
<聯系人:聯系人>
<聯系人:姓名>李四</聯系人:姓名>
<聯系人:ID>002</聯系人:ID>
<聯系人:公司>B公司</聯系人:公司>
<聯系人:EMAIL>li@bbb.org</聯系人:EMAIL>
<聯系人:電話>(021)87654321</聯系人:電話>
<聯系人:地址>
<聯系人:街道>南京路9876號</聯系人:街道>
<聯系人:城市>上海市</聯系人:城市>
<聯系人:省份>上海</聯系人:省份>
</聯系人:地址>
<聯系人:直接上司>aa</聯系人:直接上司>
</聯系人:聯系人>
</聯系人:聯系人列表>

client.xsd:
<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<!--W3C Schema generated by XMLSpy v2005 sp1 U (http://www.xmlspy.com)-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="id" targetNamespace="id" elementFormDefault="qualified">
<xs:element name="EMAIL" type="xs:string"/>
<xs:element name="ID" type="xs:string"/>
<xs:element name="公司" type="xs:string"/>
<xs:element name="地址">
<xs:complexType>
<xs:sequence>
<xs:element ref="街道"/>
<xs:element ref="城市"/>
<xs:element ref="省份"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="城市" type="xs:string"/>
<xs:element name="姓名" type="xs:string"/>
<xs:element name="電話" type="xs:string"/>
<xs:element name="省份" type="xs:string"/>
<xs:element name="聯系人">
<xs:complexType>
<xs:sequence>
<xs:element ref="姓名"/>
<xs:element ref="ID"/>
<xs:element ref="公司"/>
<xs:element ref="EMAIL"/>
<xs:element ref="電話"/>
<xs:element ref="地址"/>
<xs:element ref="直接上司"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="聯系人列表">
<xs:complexType>
<xs:sequence>
<xs:element ref="聯系人" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="街道" type="xs:string"/>
<xs:element name="直接上司" type="xs:anyType"/>
</xs:schema>
manager.xsd:
<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<!--W3C Schema generated by XMLSpy v2005 sp1 U (http://www.xmlspy.com)-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="id2" targetNamespace="id2" elementFormDefault="qualified">
<xs:element name="企業經理">
<xs:complexType>
<xs:sequence>
<xs:element ref="姓名"/>
<xs:element ref="電話"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="姓名" type="xs:string"/>
<xs:element name="手機" type="xs:string"/>
<xs:element name="電話">
<xs:complexType>
<xs:sequence>
<xs:element ref="秘書電話"/>
<xs:element ref="手機"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="秘書電話" type="xs:string"/>
</xs:schema>

說明:我在這里用id和id2來表示命名空間是應為很多人會認為那個命名空間的網址會在解析XML的時候被訪問,我一開始也這樣認為,所以改成id來做個測試。
初學進階里面說命名空間是用于在一個XML里面引入多個DTD的,的確,概念上是這樣子的,不過網上的資料顯示XML的命名空間并不支持DTD格式的格式定義,也就是說,想實現一個XML當中有多個文檔格式的話,就必須要使用Schema。
先了解一下我們要實現的例子:

<聯系人列表>




















以上是我們想要最終表達的數據格式,其中,聯系人的直接上司屬性有點麻煩,因為整個直接上司表達的是一個“企業經理”的“對象”,該“對象”可以以另外的XML形式體現,如下:









看以上的兩個文檔,實際上就是我們想表達的數據,兩個抽象的實體“聯系人”和“企業經理”之間存在著一對一的關系。
但是我們現在有個麻煩,在聯系人列表這個XML當中,有兩個“姓名”元素和兩個“電話”元素,他們表達的是不同的意思,其文檔格式定義也不同。他們分別對應著不同的DTD或者是Schema。
為了解決這一問題,就有了命名空間的概念,首先,對于我們要最終作用于其上的client.xml,他必須首先區別聯系人和企業經理,做法就是在前面加前綴,比如聯系人的名字改為“聯系人:名字”而企業經理的名字則改為“企業經理:名字”
其次,兩個不同的文檔定義文件必須首先定義好命名空間,在作用于XML文件的時候,使命名空間和XML聲明中的命名空間一致。
下面分別給出例子代碼:
client.xml:








































client.xsd:










































manager.xsd:
























說明:我在這里用id和id2來表示命名空間是應為很多人會認為那個命名空間的網址會在解析XML的時候被訪問,我一開始也這樣認為,所以改成id來做個測試。
posted on 2005-03-08 17:32 Boris-Java 閱讀(1023) 評論(0) 編輯 收藏 所屬分類: java&xml