XML Namespaces
เนื้อหา ทำไมต้องมี namespaces ? การแก้ไขปัญหา name conflict Namespaces สำหรับ attributes namespaces และ DTD
XML Namespaces XML Namespaces เป็นวิธีการที่ใช้ในการหลีกเลี่ยง element name conflicts element name conflict เนื่องจากชื่ออีลีเมนต์ใน XML ไม่จำกัดแน่นอนตายตัว บ่อยครั้งที่เกิดชื่อซ้ำกัน หรือ ขัดแย้งกัน (name conflict) เมื่อเอกสาร เอกสารที่แตกต่างกัน ใช้ชื่อเดียวกันในการอธิบายอีลีเมนต์ 2 อีลีเมนต์ที่แตกต่างกัน
ตัวอย่างของ element name conflict <table> <tr> <td>Apples</td> <td>Bananas</td> </tr> </table> <table> <name>African Coffee Table</name> <width>80</width> <length>120</length> </table> ทั้งสองเอกสารมีอีลีเมนต์ <table> ที่มีนิยามและเนื้อหาที่แตกต่างกัน
ทำไมต้องมี namespaces ? ภายในอีลีเมนต์ ชื่อของแอททริบิวต์จะต้องเป็นค่าที่ unique แต่อีลีเมนต์ 2 อีลีเมนต์สามารถมีแอททริบิวต์ชื่อเดียวกันได้ เรียกแอททริบิวต์ของอีลีเมนต์ที่แตกต่างกัน ว่า เป็นของ namespaces ที่แตกต่างกัน นำไปสู่ปัญหาการชนกันระหว่างชื่อของอีลีเมนต์ เมื่อ integrate ข้อมูลจากหลายแหล่งข้อมูล เมื่อใช้ XML-based languages ร่วมกัน เช่น MathML ร่วมกับ SVG อาจทำให้เกิดความกำกวมในการประมวลผล
W3C recommendation http://www.w3.org/TR/REC-xml-names/ W3C กำหนด recommendation สำหรับ namespaces ใน XML http://www.w3.org/TR/REC-xml-names/
การแก้ปัญหา name conflict โดยใช้ Prefix <h:table> <h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> </h:tr> </h:table> <f:table> <f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length> </f:table> ทั้งสองเอกสารใช้ชื่อที่แตกต่างกันสำหรับอีลีเมนต์ <table> (<h:table> และ <f:table>)
Name conflict solution ให้กำหนด element names ด้วย URIs เนื่องจาก URI จัดเป็น unique identifier Universal Resource Identifier (URI) สายอักขระที่จัดเป็น unique identifier ใช้ในการกำหนดทรัพยากรในระบบเครือข่ายอินเทอร์เน็ต รูปแบบของ URI ที่ใช้บ่อยที่สุด ได้แก่ Uniform Resource Locator (URL) ที่กำหนดที่อยู่โดเมนของเครือข่ายอินเทอร์เน็ต อีกรูปแบบของ URI ได้แก่ Universal Resource Name (URN)
Name conflict solution ชื่อที่จัดเป็น qualified name ประกอบด้วย 2 ส่วน namespace:local-name เช่น <http://www.furniture.com/furniture> … </ http://www.furniture.com/furniture> เมื่อ http://www.furniture.com/furniture จัดเป็น URI และ namespace
การประกาศ Namespace การใช้ URIs ทุกแห่งในอีลีเมนต์ไม่สะดวก ใช้การประกาศ namespace และ prefix ที่เกี่ยวข้อง (user-specified คือ ผู้ใช้สามารถกำหนดได้เอง) <f:table xmlns:f="http://www.furniture.com/furniture"> <f:name>African Coffee Table</f:name> ... </...> ประกาศ namespace คือ http://www.furniture.com/tableที่สอดคล้องกับ prefix “f” URI ไม่จำเป็นต้องอ้างอิง Web resource จริงๆ แต่ใช้เพื่อแยกแยะความแตกต่างของชื่อเท่านั้น
การแก้ปัญหา name conflict โดยใช้ namespaces <h:table xmlns:h="http://www.w3.org/TR/html4/"> <h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> </h:tr> </h:table> <f:table xmlns:f="http://www.w3schools.com/furniture"> <f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length> </f:table> ใช้ แอททริบิวต์ xmlns กับแท็ก <table> เพื่อกำหนดชื่อที่เกี่ยวข้องกับ namesapce ให้กับ element prefix แทนการใช้ prefix
Default Namespaces การกำหนดdefault namespace สำหรับอีลีเมนต์ ทำให้ไม่ต้องกำหนด prefixes ในอีลีเมนต์ลูกทั้งหมด <element xmlns="namespace"> <table xmlns="http://www.w3.org/TR/html4/"> <tr> <td>Apples</td> <td>Bananas</td> </tr> </table> <table xmlns="http://www.w3schools.com/furniture"> <name>African Coffee Table</name> <width>80</width> <length>120</length> </table>
Overriding Namespaces <book xmlns="http://www.book...."> <title>Disgrace</title> <author xmlns="http://www.person..."> <name>John Coetzee</name> <title>Professor</title> </author> <year>1999</year> </book> default namespace ถูก override ใน author book, title แรก และ year ใช้ namespace “www.book...” author, name และ title ที่สอง ใช้ namespace “www.person...”
Namespaces และ DTD namespaces ถูกกำหนดขี้นใช้งานหลังจากการกำหนด DTDs DTD ไม่สนับสนุน namespace แต่ใน DTD สามารถประกาศชื่ออีลีเมนต์เป็น person:title ในตัวอย่าง DTD ต่อไปนี้ <!ELEMENT title ...> <!ATTLIST title xmlns CDATA #FIXED "http://www.person.com"> <!ELEMENT person:title ...> <!ATTLIST person:title xmlns:person CDATA #FIXED "http://www.person.com"> title และ person:title จัดว่าเป็นชื่ออีลีเมนต์แตกต่างกันในเอกสารที่ valid แต่ในข้อกำหนดของ namespaces (namespaces specification) จัดว่า ไม่แตกต่างกัน
สรุป ความจำเป็นในการกำหนด namespace ใน XML มักใช้งานใน e-commerce application ที่มีการ integrate ข้อมูลจากหลายแหล่ง