曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
開始三個子元素,但是已經為作者詳細信息創建了一個獨立的模式,于是需要去參閱那個命名
空間并借用它(參見圖7 - 4)。
圖7-4
正如提到的,我們能夠利用< d e s c r i p t i o n >元素去生成有關對于處理應用程序可利用的D T D信
息,這就是我們要做的,這里我們正使用它來指定< P u b l i s h e r >元素可用于出版商信息。
程序清單7 - 4 3
深入研究模式, < C o r p o r a t e N a m e >元素,它非常簡單,包含D T D里的P C D ATA,于是我們指
定它的內容只是文本:
第7章命名空間和模式使用233 下載
出版商
公司名稱
地址
出版印記
作者
下面我們具有地址信息,你可以想起包含一個y e s / n o的h e a d q u a r t e r s屬性枚舉,首先定義:
程序清單7 - 4 4
注意X M L - D R里的e n u m e r a t i o n數據類型表單。接下來,我們聲明用在地址元素里的元素:
程序清單7 - 4 5
< P u b l i s h e r >元素的第三個子元素打算留下出版商的特征:
程序清單7 - 4 6
< P u b l i s h e r >元素的第四個子元素具有D T D里的作者信息細節,但是鑒于我們已經將它刪除,
接下來轉向討論< T h r e a d >。
(2) 線索
< T h r e a d >用來指明書的分類區域。通過書封底上的代碼,你能夠看到三個不同的線索,它
們用來給書籍分類,例如在書店,當決定將書放到哪部分時它們將被使用。
程序清單7 - 4 7
234使用XML 高級編程
下載
我們再一次使用< d e s c r i p t i o n >元素去解釋什么樣的線索被使用。
(3) 書
最后一部分來處理書自身的內容。就像我們在D T D章節里說明的,書一定包含標題、摘要、
介紹的主題種類和價格(參見圖7 - 5)。
圖7-5
在我們定義這些元素之前,必須定義幾個屬性:
下面看看p a g e C o u n t屬性。這里我們將真正使用強大的數據類型功能。我們將給這個屬性一
個整數類型:
然后我們繼續各種引用:
程序清單7 - 4 8
既然設置了將要使用的屬性,聲明< B o o k >的內容,它使用了剛剛聲明的屬性和幾個子元素:
程序清單7 - 4 9
第7章命名空間和模式使用235 下載
圖書
書名
摘要
推薦主題分類
價格(可選)
然后,描述這些子元素的內容:
程序清單7 - 5 0
< P r i c e >元素聲明又將我們帶到數據類型支持。貨幣屬性需要一個枚舉,同時元素的文本值
本身應該是一個數值類型以適于描述貨幣:
程序清單7 - 5 1
這就是說,通過一些從D T D語法到X M L - D R的轉換,以及一些附加的強大數據類型,我們
創建了一個新的目錄模式,它通過命名空間的支持,重用了作者模式。這給了我們與D T D所提
供的相同種類的驗證支持,即我們改變里子c a t a l o g . x m l文件的根元素以反映使用了模式:
注意命名空間聲明排除了對D O C T Y P E的聲明。
7.8.3 模式協調
擁有模式里的所有元素和它們的內容的簡單列表將是一件非常好的事情。這就是說,對于
每一個元素聲明,我們將有一個許可的子元素和用于它屬性的列表。這樣,我們應該能夠測量
改變任何特別的元素和屬性帶來的影響。因為XML-DR 模式使用X M L語法,所以能夠使用
M S X M L和一些J a v a S c r i p t去產生這種效果。圖7 - 6就是當它完成并在PubCatalog.xml 模式文件里
指出來時看起來的樣子:
S c h e m a C o n c o r d a n c e . h t m l源代碼可從我們的站點h t t p : / / w w w.wrox.com 得到。不同于提
供一個恰當的U R L用于你需要的參考索引文件,這里沒有配置需求。
236使用XML 高級編程
下載
圖7-6
1. 搜索元素
我們知道,一個模式文檔以< S c h e m a >根元素開始。它的子元素將是< E l e m e n t Ty p e >和
< A t t r i b u t e Ty p e >元素。每個用< E l e m e n t Ty p e >元素聲明的元素包含一系列元素和屬性。這在某種
程度上簡化了我們的工作。所有我們要做的是遍歷這個< S c h e m a >元素的子結點列表,并處理每
一個搜索的< E l e m e n t Ty p e >元素。這里是所需要的代碼的核心部分:
程序清單7 - 5 2
我們知道子元素的序號,于是通過一個簡單的循環遍歷整個文檔。元素結點的N o d e N a m e屬
性可以讓我們通過查找< E l e m e n t Ty p e >名稱搜索元素聲明。
第7章命名空間和模式使用237 下載
2. 處理一個元素聲明
函數C r o s s R e f E l e m e n t ( )接收一個< E l e m e n t Ty p e >元素結點并列出它的內容。這就是一個比較
困難的地方。這里并不擔保< e l e m e n t >和< a t t r i b u t e >元素將被篩選。模式能以E l e m e n t Ty p e為序在
元素前列出屬性,然后以另外的順序反轉它們,或者甚至混合這兩者。我們需要一個連續的順
序,這樣能夠在輸出里加入適當的標題。我們將必須建立兩個數組,一個用作元素名稱,一個
用作屬性名稱,然后在結束元素聲明時顯示結果。這里是函數C r o s s R e f E l e m e n t ( )的一部分,用
來提取元素聲明信息:
程序清單7 - 5 3
當遇到一個< e l e m e n t >和< a t t r i b u t e >模式元素時,得到t y p e屬性的值,我們知道它是相關的
< E l e m e n t Ty p e >和< A t t r i b u t e Ty p e >元素的名稱。通過使用g e t N a m e I t e m ( )函數做到這一點,
M i c r o s o f t在M S X M L里使用的D O M擴展很明確地通過名稱得到屬性。如果模式不包含組,我們
的工作就已經完成。因為組涉及我們需要的特定的元素和屬性信息,所以必須調用另一個函數
S q u e e z e G r o u p ( )。這個函數看起來幾乎同在上面看到的一樣:
程序清單7 - 5 4
238使用XML 高級編程
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(85)