Archive

Archive for the ‘XML schema’ Category

XML Schema ความเข้าใจเกี่ยวกับ namespace

October 26, 2008 5 comments

จากข้อกำหนด ของ W3C  Namespace in recommendation  XML Namspeces คือกลุ่มขอล elements และ attributes ที่เป็นไปตามข้อกำหนด IRI – กลุ่มของ elements และ attributes เหล่านี้เราเรียกกว่า  XML vocabulary ครับ  สิ่งสำคัญเลยที่ทำให้ต้องมี Namespace ก็คือการหลีกเลี่ยง naming conflicts เมื่อมีการ สร้าง XML documents และมีการ เรียกใช้หลาย ๆ ที่ หรือ เรียกใช้ Vocabularies หลาย ๆ ที่  ตัวที่ต้องใช้งาน Namespace มาก ๆ ก็คือ XML schema ซึ่ง XML schema นี้เราใช้สำหรับการกำหนด vocabulary หรือ โครงสร้างของ XML ที่เราต้องการใช้งาน แฮะ แฮะ ไม่ทราบว่าจะ get หรือปล่าว  ( เราอาจจะต้องเข้าใจ XML schema และ ก็ concept ต่าง ๆ ด้วย )

Namespace ก็มีลักษณะคล้ายกับ packages ใน Java หรือ  namespace ใน C# ครับ

ครับก็คง พอจะอ้างอิงให้เห็น จากความคล้ายคลึงกันนะครับ นั่นก็เป็นเพียงการ กล่าวนำเข้าเรื่อง นะครับ ถ้าไม่เห็นตัวอย่างจากการใช้งานต่าง ๆ ก็คงยังไม่ ซึ่งใช่ไหมครับ ก็เราก็จะพูดถึง ในหัวข้อต่าง ดังนี้นะครับ

  • หน้าที่ ของ XML
  • การประกาศ ( declare ) และการใช้งาน namspaces
  • ความแตกต่างระหว่าง default-namespace และ no-namespace
  • การสร้าง Namespaces โดยใช่ XML schema และ
  • ความแตกต่างกันระหว่าง qualified และ unqualified element/attributes

การประกาศ และ การประยุกต์ใช้

Namespaces นั้นเราประกาศใน attribute ของ XML element ครับ  และก็ไม่จำเป็นว่าเราจะต้องประกาศ มันไว้ที่ root element มันสามารถที่จะประกาศไว้ใน element ใด ๆ ก็ได้ใน XML document. นั่นก็หมายความว่า มันต้องมี scope นะสิครับ  scope ของ namespace ก็ จะอยู่ภายใต้ที่ element ที่ namespace นั้นถูกประกาศครับ เริ่มตั้งแต่ opening-tag ไปจนถึง ending-tag ของ element

การประกาศ Namespace ทำดังนี้นะครับ

<someElement xmlns:pfx=”http://www.Teerapong.com”/&gt;

จากตัวอย่างจะเห็นว่า xmlns ก็คือ attribute ของ someElement นะครับ มันใช้สำหรับการ ประกาศ namespace ซึ่งชื่อของ namespace ก็คือ http://www.Teerapong.com  และ เจ้า xmlns นี้นอกจากจะประกาศ namespace แล้วยังก็หนด aliase หรือ prefix สำหรับการใช้งานอ้าง อิง namespace นี้ด้วย ฝรั่งเขาใช้คำว่า binding นะครับเวลาอ้างอิง namespace นี้ทีไหนก็ตาม ก็ใช้เฉพาะั ตัว alias หรือ prefix เท่านั้นนะครับ พอเข้าใจนะครับ อย่างเช่น เมื่อเราสร้าง XSD schema เราประกาศ แบบนี้

<xsd:schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema&#8221; .. />

หลังจากนี้เมื่อเราต้องอางอิง element หรือ types ต่าง ๆ เราก็ prefix ด้วย xsd ด้วยเสมอ แม่นบ่ครับ ไม่เช่นนั้นมันก็จะฟ้อง error ต่อว่าเราว่า ไม่มี element หรือ ไม่มี type ที่กำหนด ไว้ใน http://www.w3.org/2001/XMLSchema

อันที่จริงแล้ว prefix หรือ aliase นั้นเราจะกำหนดเป็นอะไรก็ได้นะครับ ผมรู้ว่ามีคำถามนี้อยู่ในใจ เราสามารถกำหนดให้เป็นอะไรก็ได้ตามใจท่านนะครับ แต่ก็ต้องไม่ลืมนะครับ ว่าต้องให้มันสื่อความหมายด้วยไม่เช่นนั้น ปัญหาผมร่วงจะมาสู่ท่านภายหลัง นะครับ software engineer เข้าเรียกว่า meaningful นะครับ

ยังมีอีก คำถาม หนึ่งมั้ง บางคนเข้าใจว่ามันจะต้องอ้างอิงไป URL หรือป่าวเห็นประกาศเป็น URL คำตอบก็คือไม่ใช่นะครับ เราจะกำหนดให้มันเป็นอะไรก็ได้ ไม่จำเป็นต้องเป็น URL ก็ได้ เนื่องจากว่า namespace นั้นใช้สำหรับการกำหนด virtual container สำหรับที่เราจะ group XML ไว้เป็นกลุ่ม ๆ ให้ง่ายต่อการอ้างอิงใช้งาน ครับ ที่เขา URL ก็เพราะว่ามันน่าจะ unique การที่จะมีการกำหนดซ้ำกันก็คงเกิดขึ้นได้น้อย ครับ

คุณอยากจะกำหนดแบบนี้ก็ได้

<someElement xmlns:pfx=”Teerapong” />

ซึ่งก็ไม่ได้ผิดกฏ หรือ ข้อกำหนดใด ๆ แต่ก็ควรให้เป็นไปตาม W3C Namespace in XML Recommendation ก็จะดี….

ครับถึงนี่แล้วก็คงจะพอเข้าใจนะครับ การใช้ namespace อันดับแรก เราจะ bind เข้ากับ aliase หรือ prefix เสร็จแล้วเวลาอ้างอิงเราก็ใช้ aliase หรือ prefix ในการอ้างอิง namespace ผมคิดว่าก็คงจะมีข้อสงสัยตามมาอีกว่าทำไมถึงไม่ใช้ namespace อ้างอิงตรง ๆ เลยหล่ะเหตุผล ก็คือ namespace ที่เรากำหนด ตาม recommendation นั้นมันจะยาวววว และที่สำคัญก็คือมันอาจจะส่งผลกระทบอัน ใหญ่หลวงกับ syntax ของ XML ก็ได้เพราะว่า มันจะมี characters ที่ไม่อนุญาตุให้ใช้ใน tags ไงครับ  🙂

<http://www.library.com:Book /> ผิด

<lib:Book xmlns:lib=”http://www.library.com”/&gt; ถูกต้อง

ดูตัวอย่าง เต็ม อีกนิด

<?xml version="1.0"?>
<Book xmlns:lib="http://www.library.com">
	<lib:Title> Sherlock Holmes</lib:Title>
	<lib:Author>Arthur Conan Doyle</lib:Author>
</Book>

อีกตัวอย่างนะครับ

<?xml version="1.0"?>
<Book xmlns:lib="http://www.library.com">
	<lib:Title>Sherlock Holmes - I</lib:Title>
	<lib:Author>Arthur Conan Doyle</lib:Author>
   <Purchase xmlns:lib="http://www.otherlibrary.com">
	<lib:Title>Sherlock Holmes - II</lib:Title>
	<lib:Author>Arthur Conan Doyle</lib:Author>
   </Purchase>
	<lib:Title>Sherlock Holmes - III</lib:Title>
	<lib:Author>Arthur Conan Doyle</lib:Author>
</Book>

ตัวอย่างนี้ จะให้เห็น ในเรื่อง scope นะครับ สังเกตุดูจะเห็นว่ามี 2 namespace ซึ่งประกาศใน Book และ purchase contentของทั้ง แม้จะกำหนด ให้มี prefix เหมือนกันก็ตาม content ของ purchase จะอ้างอิงกับ http://www.otherlibrary.com ส่วน content ของ Book จะ อ้างอิงไปยัง http://www.library.com ดังนั้น element  Title และ Author ของ Cherlock Holmes I กับ Title และ Author ของ Cherlock Holmes III จะอ้างอิงที่ namespace เดียวกัน 🙂

Default-namespace และ  No-namespace

บ้างครั้งการทำงานก็มักจะเกิเอาการขี้เกียจขึ้น บ้างท่านก็ไม่อยากจะพิมพ์ prefix หรือ aliase นำหน้า element หรือ attribute ทุกครั้ง ๆ  ในกรณีนี้ นะครับ เราสามารถที่จะใช้ default namespace แทนนะครับ แต่ต้องจำไว้นะครับ ว่าเราจะประกาศ default namespace ได้ที่ namespace เดียวนะครับ  ไม่เช่นนั้นก็จะนำซึ่งปัญหา ผมร่วงได้นะครับ

การประกาศ default namespace นี้จะทำให้ element ใดก็ตามที่อยู่ใน scope ของ default namespace นั้น จะอ้างอิงไปยัง namespace นั้นอย่างอัตโนมัติ เขาใช้ำว่า implicitly qualifies นะครับ ( ในกรณีที่เราไม่ได้กำหนด prefix ใดใด นะครับ ก็คือ ไม่ได้ explicitly qualifies ) ใช้ technical term เยอะ ก็จะงงนะครับ แต่ผ๊มมมว่า มันได้ใจความดีกว่าใช้ภาษาไทยนะครับ อย่า บ่น ผมเลยย ดูการประกาศดีกว่า


<?xml version="1.0"?>
<Book xmlns="http://www.library.com">
   <Title>Sherlock Holmes</Title>
   <Author> Arthur Conan Doyle</Author>
</Book>

ครับ นี่แหละครับ default namspace ประกาศดังนี้ทำให้เราไม่ต้อง ใส่ prefix ให้กับ element ภายใต้ scope ของ element ที่ declare  default namespace นะครับ เช่นเดียวกันนะครับ ถ้าผมยกตัวอย่างเดิมดังนี้

 <?xml version="1.0"?>
<Book xmlns="http://www.library.com">
   <Title>Sherlock Holmes - I</Title>
   <Author>Arthur Conan Doyle</Author>
   <Purchase xmlns="http://www.otherlibrary.com">
      <Title>Sherlock Holmes - II</Title>
      <Author>Arthur Conan Doyle</Author>
   </Purchase>
   <Title>Sherlock Holmes - III</Title>
   <Author>Arthur Conan Doyle</Author>
</Book>

ครับก็ ความหมายเหมือนกับ ตัวอย่างที่แล้วนะครับ scope ใครก็ scope มันนะครับ ถึงแม้จะไม่มี prefix ก็ตาม 🙂

Default Namespace และ Attribute

มันก็แปลก ๆ เล็กน้อยสำหรับ attribute กับเรื่อง Default Namespace  ไม่สามารถใช้กันได้ เป็นงั้นซะอีก นะครับ ดังนั้นการที่จะให้ attribute มันสามารถอ้างอิงไปยัง namespace ได้ก็ต้อง explicitly qualified นะครับ  สมมุติว่า element Book มี attribute ชื่อว่า isbn เราจะต้องประกาศแบบนี้นะครับ


<?xml version="1.0"?>

<Book  pfx:isbn="1234"
            xmlns="http://www.library.com"
            xmlns:pfx="http://www.library.com">
    <Title>Cherlock Holmes</Title>
    <Author>Arthur Conan Doyle</Author>
</Book>

วันนี้ต้อง หยุดไว้แค่นี้ก่อนะครับ แล้วจะมาต่อ ให้จบนะครับ