天天看點

XML(1)——shema限制之命名空間

一、XML的兩種限制DTD和Schema

摘自IBM官網一段話:“XML DTD(XML的文檔類型定義)是近幾年來XML技術領域所使用的最廣泛的一種模式。但是由于XML DTD并不能完全滿足XML自動化處理的要求,例如不能很好實作應用程式不同模間的互相協調,缺乏對文檔結構、屬性、資料類型等限制的足夠描述等等,是以W3C于2001年5月正式推薦XML Schema為XML 的标準模式。顯然,W3C希望以XML Schema來作為XML模式描述語言的主流,并逐漸代替XML DTD”。可見Schema使用的越來越多,本文先闡述Shema限制中非常重要的概念命名空間。

二、shema檔案

student.xsd

<?xml version="1.0" encoding="UTF-8"?>

<schema

xmlns="http://www.w3.org/2001/XMLSchema" 

targetNamespace="http://www.example.org/student"

elementFormDefault="qualified">

<element name="student">

<complexType>

<sequence>

<element name="num" type="int" />

<element name="name" type="string" />

<element name="birthday" type="date" />

</sequence>

</complexType>

</element>

</schema>

student.xsd就是一個shema檔案,本身也是XML格式的,也要符合一定的限制。通過幾個問題來了解xmlns和targetNamespace。

問題1如何保證shema檔案唯一性:targetNamespace

因為在引用shema檔案作為xml限制時,試想若有多個shema檔案同名以哪一個限制為準呢?是以shema通過命名空間的概念來確定唯一性,targetNamespace屬性就是指定這個xsd的命名空間的。通常使用url的形式作為targetNamespace的值來確定唯一性,而該url通常并不一定存在。

問題2如何引入shema規範:xmlns

xsd所有的标簽和屬性也必須符合schema規範,那element、complexType、sequence等标簽的規範從何而來呢?通過xmlns屬性來指定shema限制。xmlns="http://www.w3.org/2001/XMLSchema"就表示student.xsd預設不加字首的标簽和屬性必須符合w3s定義的一個schema限制。若shema檔案不是w3c組織定義的就需要指定shema檔案的位置。下面xml引入student.xsd限制時有介紹。

問題3elementFormDefault是什麼意思

該屬性是一個枚舉值:qualified、unqualified。預設是unqualified表示隻關聯根标簽student,而qualified表示關聯所有标簽和屬性如num,name,birthday。

三、XML檔案引入限制

方法1

student.xml

<student xmlns="http://www.example.org/student" 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.example.org/student student.xsd">

<num>1000</num>

<name>xy</name>

<birthday>2000-01-01</birthday>

</student>

student.xml指定了xmlns="http://www.example.org/student"限制,就是自定義的student.xsd。但正如問題②所說shema檔案不是w3c組織定義的就需要指定shema檔案的位置。

問題4如何指定xsd位置:schemaLocation

通過schemaLocation指定shema檔案位置。但schemaLocation屬性由http://www.w3.org/2001/XMLSchema-instance限制,是以需要再通過xmlns引入這個限制。但一個标簽中隻允許一個不帶字首的xmlns标簽,是以要給新的xmlns帶一個字首xsi,字首名自定義。以下的例子很好的說明了字首的用法:

<xy:student

xmlns:xy="http://www.example.org/student"

<xy:num>1000</xy:num>

<xy:name>xy</xy:name>

<xy:birthday>2000-01-01</xy:birthday>

</xy:student>

方法2

沒有通過指定shema的命名空間而是xsd問位置來确定限制。

xmlns:xy="http://www.example.org/student" 

xsi:noNamespaceSchemaLocation="/studnet.xsd">

首段摘自:http://www.ibm.com/developerworks/cn/xml/x-sd/

本文轉自IT徐胖子的專欄部落格51CTO部落格,原文連結http://blog.51cto.com/woshixy/1416824如需轉載請自行聯系原作者

woshixuye111