謝謝您的持續收看,今天要介紹的是「名稱空間」(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-文件之特殊資料
antijava提到:
xmlns 屬性(xmlns 的 ns 就是指 namespace)進行定義。
它的定義一定要是URL嗎??可以是一串文字敘述嗎??
由於他最基本的需求是在實現某種程度範圍的「唯一性」
所以一般常見的
會使用 http://domain name 這種等級的 URI
順便可以看出是那個單位或組織
請問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 的值
參數都有改過,都抓不到
看起來DataField fieldname這部份就又不是名稱空間了
可以抓到我想抓的值了,謝謝你的幫助
二代寶可夢......抓到就好