iT邦幫忙

DAY 24
8

XML系列 第 24

[XML]24-文件之名稱空間

謝謝您的持續收看,今天要介紹的是「名稱空間」(Namespace)。
前面介紹過了元素和屬性的使用,都是在一般情形之下的使用,而在此篇,將要介紹比較特殊的情形,就是當元素或屬性名稱「重覆」時的處理方式。

以下用一個最簡單的供應鏈採購情境做說明,如下圖所示:

A 公司向 B 公司下了一張採購訂單,內容是美味蟹堡1000個,B 公司收到訂單處理後,產生三張採購原料的訂單,分別是向 C1, C2, C3 三家公司採購原料。

在 B 公司看到的 XML 大概長成這樣

<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
	<SALESORDER>
		<ORDER PO="A001">
			<ITEM>美味蟹堡</ITEM>
			<QTY>1000</QTY>
			<PRICE>40</PRICE>
		</ORDER>
	</SALESORDER>
	<PURCHASEORDER>
		<ORDER PO="BC1001">
			<ITEM>蟹堡麵包</ITEM>
			<QTY>1000</QTY>
			<PRICE>5</PRICE>
		</ORDER>
		<ORDER PO="BC2001">
			<ITEM>美味蟹肉</ITEM>
			<QTY>100</QTY>
			<PRICE>10</PRICE>
		</ORDER>
		<ORDER PO="BC3001">
			<ITEM>蕃茄</ITEM>
			<QTY>1000</QTY>
			<PRICE>10</PRICE>
		</ORDER>
	</PURCHASEORDER>
</ROOT>

由上面的 XML 可以看出,列 4 到列 8 ,和列 11 到列 25,雖然都是 ORDER 元素,結構也類似,但是其代表的意義卻截然不同。

站在 A 的立場,列 4 到列 8 是他的 Purchase Order ,而對 B 而言,列 4 到列 8 是所謂的 Sales Order,而列 11 到列 25 是所謂的 Purchase Order;而對C1,C2,C3而言,列 11 到列 25 是他的 Sales Order。

不同的公司,在同一份 XML 文件中,難免會用到相同的元素名稱,除了一些可以共用而不會混淆的元素之外,要解決這種重覆命名的問題,就是使用「名稱空間」。

使用名稱空間之後,XML 大概會長得像這樣

<?xml version="1.0" encoding="UTF-8"?>
<ROOT xmlns:ca="http://www.companya.com.tw" 
              xmlns:cb="http://www.companyb.com.tw">
	<SALESORDER>
		<ca:ORDER ca:PO="A001">
			<ca:ITEM>美味蟹堡</ca:ITEM>
			<ca:QTY>1000</ca:QTY>
			<ca:PRICE>40</ca:PRICE>
		</ca:ORDER>
	</SALESORDER>
	<PURCHASEORDER>
		<cb:ORDER cb:PO="BC1001">
			<cb:ITEM>蟹堡麵包</cb:ITEM>
			<cb:QTY>1000</cb:QTY>
			<cb:PRICE>5</cb:PRICE>
		</cb:ORDER>
		<cb:ORDER cb:PO="BC2001">
			<cb:ITEM>美味蟹肉</cb:ITEM>
			<cb:QTY>100</cb:QTY>
			<cb:PRICE>10</cb:PRICE>
		</cb:ORDER>
		<cb:ORDER cb:PO="BC3001">
			<cb:ITEM>蕃茄</cb:ITEM>
			<cb:QTY>1000</cb:QTY>
			<cb:PRICE>10</cb:PRICE>
		</cb:ORDER>
	</PURCHASEORDER>
</ROOT>

可以很清楚地看到,在原本的元素前面,加上了所謂的 Prefix,而 Prefix 的定義,則是在第2列和第3列的地方以 xmlns 屬性(xmlns 的 ns 就是指 namespace)進行定義。

如此的做法,不但可以避免元素重覆引起混淆的問題,也可以很清楚地看出來,那些元素是由那些單位組織定義的,當對資料不知如何處理時,才有跡可循。

本系列文章列表
Next : [XML]25-文件之特殊資料


上一篇
[XML]23-文件之屬性
下一篇
[XML]25-文件之特殊資料
系列文
XML30
0
總裁
iT邦好手 1 級 ‧ 2011-10-21 09:59:45

antijava提到:
xmlns 屬性(xmlns 的 ns 就是指 namespace)進行定義。

它的定義一定要是URL嗎??可以是一串文字敘述嗎??疑惑

根據W3C規定
Namespace要用 URI 的型式

由於他最基本的需求是在實現某種程度範圍的「唯一性」
所以一般常見的
會使用 http://domain name 這種等級的 URI
順便可以看出是那個單位或組織
謝謝

總裁 iT邦好手 1 級 ‧ 2011-10-21 10:32:47 檢舉

筆記

0
modernsarah
iT邦研究生 4 級 ‧ 2011-10-21 11:38:38

I like 鍵結圖~
沙發

0
philchen911
iT邦新手 5 級 ‧ 2017-02-16 14:34:46

請問XML檔像以下的狀況,可以透過MSSQL的OPENXML匯入DB,可以直接略過嗎?
謝謝
<pmlcore:Sensor xmlns:pmluid="urn:autoid:specification:universal:Identifier:xml:schema:1" xmlns:pmlcore="urn:autoid:specification:interchange:PMLCore:xml:schema:1" xsi:schemaLocation="urn:autoid:specification:interchange:PMLCore:xml:schema:1./PML/SchemaFiles/Interchange/PMLCore.xsd">
pmluid:IDCMO-AUP-01</pmluid:ID>
pmlcore:Observation
pmlcore:DateTime2016-12-15T03:09:49.537Z</pmlcore:DateTime>
pmlcore:CommandMANU_PACK</pmlcore:Command>
pmlcore:Tag
<pmluid:ID schemeID="GS1">00647198720000000695</pmluid:ID>
pmlcore:Data
pmlcore:XML
(EPCStatus) WS (/EPCStatus)

4719872
Pallet
2

</pmlcore:XML>
</pmlcore:Data>
</pmlcore:Tag>
</pmlcore:Observation>
</pmlcore:Sensor>

看更多先前的回應...收起先前的回應...

抱歉我不太懂略過的意思
匯入XML時會由匯入的那隻程式對資料格式做一堆檢查
檢查OK了就匯入
不OK就退件

抱歉,我沒說清楚。
匯入SQL後,XML有名稱空間的部份要如何用OPENXML轉換成gridview?
謝謝

抱歉我沒用過OPENXML
Google到這篇你看看有沒有幫助

謝謝你提供的文章,很有幫助
不過還差一點,目前已經有轉換成gridview
目前抓到的值是fieldname後的1234,我要抓的是AAAA,XML語法是以下這樣寫
(DataField fieldname=1234)AAAA(/DataField)
(DataField fieldname=1235)BBBB(/DataField)

謝謝

真的有幫助的話

SELECT    *
FROM       OPENXML (@XmlDocumentHandle, '/Cube/Cube/Cube',1)
            WITH ( [currency]  VARCHAR(4),[rate] DECIMAL(12,4))

把 /Cube/Cube/Cube 後面的參數改成 3 試試看
或者改成 2 試試看
我如果沒看錯的話
1是取 attribute 的值
3是取 element 的值

http://ithelp.ithome.com.tw/upload/images/20170217/20097833dVZG99McQx.png

參數都有改過,都抓不到
看起來DataField fieldname這部份就又不是名稱空間了

可以抓到我想抓的值了,謝謝你的幫助

二代寶可夢......抓到就好

我要留言

立即登入留言