AJAX và một số kỹ thuật liên quan - Phần 5

Một số khái niệm schema, namespace, XSD, DTD...


Vì SOAP là sự kết hợp giữ HTTP và XML, nên khi làm việc với SOAP, bạn cần nắm được một số khái niệm cơ bản về XML, như namespace, XSD, DTD. Tôi thấy rằng chúng ta nên ôn lại các vấn đề này.

Mọi tài liệu XML, khi đưa vào sử dụng, đều cần phải thỏa mãn 2 điều kiện : định dạng đúng và hợp lệ.

Định dạng đúng là tuân thủ chính xác cú pháp của ngôn ngữ XML. Hợp lệ là tên của các phần tử trong hồ sơ phải phù hợp với các quy định nêu ra trong DTD hoặc XSD của nó.

DTD - Document Type Definion - là 1 file dạng text, chỉ định các phần tử nào được phép trong tài liệu XML. Một DTD giản lược cho các RSS có thể trông như thế này :

<!DOCTYPE RSS [
  <!ELEMENT RSS(CHANNEL)>
  <!ELEMENT CHANNEL(item+)>
  <!ELEMENT item(title, description,link, pubDate)>
  <!ELEMENT title(#PCDATA)>
  <!ELEMENT description (#PCDATA)>
  <!ELEMENT link(#PCDATA)>
  <!ELEMENT pubDate(#PCDATA)>

<!ATTLIST CHANNEL CHAN CDATA #REQUIRED>
...
]>


Để biết thêm về DTD, hãy tham khảo :

http://en.wikipedia.org...Document_Type_Definition
http://www.w3schools.com/dtd/dtd_elements.asp


XSD - XML Schema Definition - là một file dạng XML có chức năng tương tự DTD, nhưng cho phép quy định rõ hơn về kiểu dữ liệu của các phần tử trong hồ sơ. XSD có thể gọi tắt là schema. Một schema trông như sau :

<?xml version="1.0" encoding="UTF-8"?>
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
          xmlns:tns="http://schemas.xmlsoap.org/soap/envelope/"
          targetNamespace="http://localhost/shema.xml">
  <xs:element name="MathPowResponse">
  <xs:complexType>
    <xs:sequence>
    <xs:element name="num" type="xs:integer"/>
    <xs:element name="result" type="xs:integer"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>


Để có thêm thông tin về schema, hãy tham khảo :

http://en.wikipedia.org/wiki/Schema
http://www.w3schools.com/dtd/dtd_elements.asp


Các DTD và XSD được đưa vào hồ sơ XML thông qua thuộc tính xmlns. Điều này tạo ra các namespace - không gian tên. Nhờ các namespace, vấn đề trùng tên của các phần tử trong một tài liệu XML kết hợp từ nhiều nguồn, được giải quyết một cách dễ dàng.

Chẳng hạn dịch vụ Google News cung cấp các bản tin dạng RSS, với phần tử description mô tả tóm tắt về một tin tức. Trong khi Amazon lại cung cấp thông tin về 10 cuốn sách xuất bản gần nhất bằng một file dạng XML mà trong đó chứa các phần tử description giới thiệu về nội dung cuốn sách. Nếu bạn tổng hợp 2 tài liệu trên thành 1 hồ sơ XML của bạn, việc đưa các namespace vào để phân biệt 2 dạng sử dụng của description trong hồ sơ là cần thiết. và bạn làm như sau :

<gn:description xmlsn:gn="http://news.google.com/Schema">
    New York utility workers searched through the night for...
</gn:description>

<am:description xmlsn:gn="http://amazon.com/Schema">
  Here in our Harry Potter store we have something for everyone...
</am:description>


gnam ở đây là tên rút gọn (short name) của các namespace. Chúng nằm trước tên của phần tử và ngăn cách với tên phần tử bằng dấu 2 chấm ":". Thuộc tính xmlsn sau đó cho biết tên phần tử được sử dụng theo cách định nghĩa trong các giản đồ ở địa chỉ "http://news.google.com/Schema" và "http://amazon.com/Schema". (2 URL này chỉ mang tính minh họa).

Bạn cũng có thể đặt các quy ước cho short name ở phần đầu của hồ sơ XML, hay trong parent node của phần tử. Tất nhiên, phải quy ước trước khi sử dụng.

Đến đây, bạn có thể hiểu đoạn XML sau mang ý nghĩa gì chứ ?

<SOAP-ENV:Envelope
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/1999/XMLSchema">
  <SOAP-ENV:Body>
    <sn:MathPowResponse xmlns:sn="uri:http://localhost/shema.xml">
        <sn:result>25</sn:result>
    </sn:MathPowResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>


Một cách khái quát, đoạn XML này mô tả 1 phần tử có tên là Envelope sử dụng short name là SOAP-ENV :
    
<SOAP-ENV:Envelope

Phần tử Envelope này có namespace ở http://schemas.xmlsoap.org/soap/envelope/ :
     xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"

Tiếp đó là 1 phần tử Body. Phần tử này cũng sử dụng short name là SOAP-ENV, nhưng đã định nghĩa trên Parent node của nó là Envelope.

Tiếp đến là 1 phần tử MathPowResponse, tại đây có 1 short name khác tên là sn, chưa định nghĩa. Dó đó, nó cần được định nghĩa :
    
<sn:MathPowResponse xmlns:sn="uri:http://localhost/shema.xml">

Và cuối cùng là 1 phần tử result, cũng sử dụng short name sn, nhưng không cần định nghĩa lại nữa.

Trong thẻ Envelope còn 2 định nghĩa cho các shortname xsi và xsd. Bạn cũng thấy 1 khái niệm khác là encodingStyle. Mọi thông điệp SOAP đều có thuộc tính này. encodingStyle cho biết kiểu dữ liệu, cũng như quy tắc về tính tuần tự trong thông điệp SOAP.

Nếu làm việc với SOAP, bạn sẽ gặp nhiều đoạn XML như vậy hoặc có thể khác đôi chút, nhưng cũng không khó hiểu lắm đâu.