Tìm hiểu Namespace trong XML

Bài mới nhất gửi 03/12/2008 10:04 AM, do TrungDD gửi. 3 hồi âm.
Trang 1 trên 1
Cách sắp xếp: Trước Tiếp
  • 26/11/2008 7:05 PM

    • TrungDD
    • Top 10 Contributor
    • Joined on 29/07/2008
    • Bài gửi 417
    • Điểm 1,550

    Tìm hiểu Namespace trong XML

    Namespace

     

    Có một khái niệm rất quan trọng trong XML là Namespace. Nó cho ta cách cùng một tên của Element để nói đến hai thứ dữ liệu khác nhau trong cùng một tài liệu XML. Giống như có hai học sinh trùng tên Tuấn trong lớp học, ta phải dùng thêm họ của chúng để phân biệt ta gọi Tuấn Trần hay Tuấn Lê. Thí dụ như có một order được người ta đặt trong cửa hàng sách như sau:

     

    <?xml version="1.0"?>

    <BookOrder OrderNo="1234">

       <OrderDate>2001-01-01</OrderDate>

       <Customer>

          <Title>Mr.</Title>

          <FirstName>Graeme</FirstName>

          <LastName>Malcolm</LastName>

       </Customer>

       <Book>

          <Title>Treasure Island</Title>

          <Author>Robert Louis Stevenson</Author>

       </Book>

    </BookOrder>

    Khi quan sát kỹ, ta thấy có thể có sự nhầm lẫn về cách dùng Element Title. Trong tài liệu có hai loại Title, một cái dùng cho khách hàng Customer nói đến danh hiệu Mr., Mrs., Dr., còn cái kia để nói đến tên của một quyển sách Book.


    Để tránh sự lầm lẫn, bạn có thể dùng Namespace để nói rõ tên Element ấy thuộc về giòng họ nào. Giòng họ ấy là một Universal Resource Identifier (URI). Một URI có thể là một URL hay một chỗ nào định nghĩa tính cách độc đáo của nó. Một namespace cũng không cần phải nói đến một địa chỉ Internet, nó chỉ cần phải là có một, không hai.


    Bạn có thể khai báo namespace trong một Element bằng cách dùng Attribute xmlns (ns trong chữ xmlns là viết tắt cho namespace) bạn cũng có thể khai báo một default namespace để áp dụng cho những gì nằm bên trong một Element, nơi bạn khai báo namespace. Thí dụ tài liệu đặt hàng có thể được viết lại như sau:

     

    <?xml version="1.0"?>

    <BookOrder OrderNo="1234">

       <OrderDate>2001-01-01</OrderDate>

       <Customer xmlns="http://www.northwindtraders.com/customer">

          <Title>Mr.</Title>

          <FirstName>Graeme</FirstName>

          <LastName>Malcolm</LastName>

       </Customer>

       <Book xmlns="http://www.northwindtraders.com/book">

          <Title>Treasure Island</Title>

          <Author>Robert Louis Stevenson</Author>

       </Book>

    </BookOrder>

     

    Ta đã tránh được sự nhầm lẫn vì bên trong Customer thì dùng namespace http://www.northwindtraders.com/customer và bên trong Book thì dùng namespace http://www.northwindtraders.com/book.

    Tuy nhiên, ta sẽ giải quyết làm sao nếu trong order có nhiều customer và nhiều book. Nếu cứ thay đổi namespace nhiều lần và phải viết đầy đủ như trên đây thì tốn quá nhiều công sức và tài liệu trông rườm rà, khó theo dõi. Một cách giải quyết là khai báo chữ viết tắt cho các namespaces ngay ở đầu tài liệu, trong root Element (tức là Document Element). Sau đó bên trong tài liệu ta sẽ prefix các Element cần xác nhận namespace bằng chữ viết tắt của namespace đó. Thí dụ như sau:

     

    <?xml version="1.0"?>

    <BookOrder  xmlns="http://www.northwindtraders.com/order"        xmlns:cust="http://www.northwindtraders.com/customer"

           xmlns:book="http://www.northwindtraders.com/book" OrderNo="1234">

       <OrderDate>2001-01-01</OrderDate>

       <cust:Customer>

          <cust:Title>Mr.</cust:Title>

          <cust:FirstName>Graeme</cust:FirstName>

          <cust:LastName>Malcolm</cust:LastName>

       </cust:Customer>

       <book:Book>

          <book:Title>Treasure Island</book:Title>

          <book:Author>Robert Louis Stevenson</book:Author>

       </book:Book>

    </BookOrder>

     

    Trong tài liệu XML trên ta dùng 3 namespace: một default namespace tên http://www.northwindtraders.com/order, namespace http://www.northwindtraders.com/customer (viết tắt là cust) và namespace http://www.northwindtraders.com/book (viết tắt là book).

     

    Các Element và Attribute không có prefix (tức là không có chữ tắt đứng trước) như BookOrder, OrderNo, và OrderDate, được coi như thuộc về default namespace. Để đánh dấu một Element hay Attribute không thuộc về default namespace, một chữ tắt, đại diện namespace sẽ được gắn làm prefix cho tên Element hay Attribute. Thí dụ như cust:LastName, book:Title.

     

    Xếp trong: ,
    • Điểm bài gửi: 3
  • 01/12/2008 8:53 AM trả lời cho

    • TrungDD
    • Top 10 Contributor
    • Joined on 29/07/2008
    • Bài gửi 417
    • Điểm 1,550

    Re: Tìm hiểu Namespace trong XML

    Validate XML khi sử dụng Namespace

    Giả sử chúng ta có một tài liệu XML như sau, trong đó ta sử dụng các prefix tương ứng với các namespace của nó.

     Khai báo namespace trong tài liệu DTD như sau:

    Ở đây ta cũng có thể khai báo thuộc tính dạng như xmlns:Tag hay xmlns:Att một cách đơn giản hơn.

    Xếp trong: ,
    • Điểm bài gửi: 3
  • 01/12/2008 9:08 AM trả lời cho

    • TrungDD
    • Top 10 Contributor
    • Joined on 29/07/2008
    • Bài gửi 417
    • Điểm 1,550

    Re: Tìm hiểu Namespace trong XML

    Sử dụng nhiều namespace trong các DTD khác nhau

    Đoạn mã XML sau đây cung cấp cho chúng ta một ý tưởng để sử dụng nhiều DTD trong tài liệu XML và đồng thời cũng chỉ ra các namespace sử dụng trong các DTD đó như thế nào:

    File: s.dtd

    File: s1.dtd

    File: student.xml


     

    Xếp trong: , , ,
    • Điểm bài gửi: 3
  • 03/12/2008 10:04 AM trả lời cho

    • TrungDD
    • Top 10 Contributor
    • Joined on 29/07/2008
    • Bài gửi 417
    • Điểm 1,550

    Re: Tìm hiểu Namespace trong XML

    Namespace trong XML Schema

    Trong XML Schema, bạn có thể tạo ra các thành phần, như phần tử (element) và kiểu (type), có tên duy nhất trong namespace của schema. Một phần tử là phạm vi định nghĩa của namespace, có thể ghi đè một khai báo namespace được định nghĩa trong phần tử cha. Vì namespace định nghĩa một ngữ cảnh trong đó các identifier phải là duy nhất nên các schema có thể tích hợp các định nghĩa từ các namespace khác một cách an toàn – thậm chí là cả với các namespace cùng tên. Bài viết này sẽ giải thích một vài sắc thái của XML và các namespace trong schema, cùng với các ví dụ minh họa.

    Với thuộc tính xmlns trong một XML schema, bạn có thể định nghĩa các thành phần sau:

        * Một namespace mặc định, áp dụng cho các phần tử không có tiền tố (prefix)

        * Các tiền tố (prefix) tham chiếu tới các namespace khác. Một tiền tố là dạng viết tắt cho một namespace. Để định nghĩa một tiền tố, thêm dấu 2 chấm (:) và tên tiền tố vào xmlns

    Xem xét ví dụ sau:


    Ở đây, bạn có thể suy diễn như sau:

        * xmlns:ns1 định nghĩa một tiền tố ns1, một kiểu viết tắt cho “prefixedURI

        * Namespace mặc định cho container là “defaultURI”, cũng được áp dụng cho tất cả các phần tử không ghi đè mặc định trong container, ví dụ như child. Trong ví dụ này, child cũng có thể bao gồm một khai báo namespace mặc định ghi đè khai báo namespace từ container trong ngữ cảnh của child.

    Quy tắc này tương tự với việc định nghĩa một biến địa phương có cùng tên với biến thành viên trong lập trình Java. Khi ở trong phạm vi, biến địa phương sẽ ẩn biến toàn cục.

    Trong trường hợp này, tiền tố ns1 là dạng viết tắt của “prefixedURI”. Do vậy, child ở trong namespace “prefixedURI”. Một cách khác để thu được kết quả tương tự là định nghĩa namespace mặc định, như sau:

    Lưu ý: Không có giới hạn nào áp dụng cho số lượng tiền tố có thể tham chiếu cùng một namespace, thậm chí là trong cùng phạm vi.

    Schema Namespaces

    Một schema khai báo một namespace với thuộc tính targetNamespace cho các thành phần được định nghĩa toàn cục. Các thành phần đó là hậu duệ trực tiếp của phần tử schema và là những thành phần duy nhất bạn có thể tham chiếu bên ngoài schema. Nếu bỏ đi thuộc tính targetNamespace thì schema sẽ được định nghĩa mà không có namespace. Bạn có thể chỉ ra các phần tử và thuộc tính có ở trong targetNamespace hay không bằng các thuộc tính elementFormDefaultattributeFormDefault. Cú pháp như sau:

    Thiết kế chung như sau:

        * Định nghĩa elementFormDefaultqualified (phải tham chiếu bằng tên đầy đủ) để tất cả phần tử phải ở trong một namespace trong tài liệu XML tương ứng của schema.

        * Để attrbuteFormDefaultundefined (không được xác định – đây cũng là thiết lập mặc định), do đó, có thể khiến các thuộc tính không thuộc namespace.

    Để ghi đè các giá trị đó, định nghĩa form cho một thuộc tính hoặc phần tử. Ví dụ, việc định nghĩa form là unqualified đòi hỏi schema phải định nghĩa tất cả thuộc tính và phần tử trong cùng một namespace. Namespace mặc định trong tài liệu XML tương ứng không áp dụng cho các thuộc tính.

    Đoạn mã dưới đây sẽ minh họa các quy tắc mà chúng ta vừa đề cập ở trên.

    Ở đây, bạn có thể suy diễn như sau:

        * Các phần tử, purchaseOrder, comment và complexType PurchaseOrderType, được định nghĩa trong namespace “http://www.w3.org/2001/XMLSchema/po.xsd” như một kết quả của việc định nghĩa cho targetNamespace.

        * Thuộc tính elementFormDefault yêu cầu tất cả các phần tử là qualified. Để đạt được mục đích đó, các phần tử phải sử dụng hoặc tiền tố, hoặc namespace mặc định.

        * Schema này không định nghĩa thuộc tính attributeFormDefault; do vậy, chúng ta giả thiết rằng unqualified là được mặc định.

    Xem xét ví dụ dưới đây của một tài liệu XML tương ứng.

    Ở đây, bạn có thể suy diễn như sau:

        * Phần tử gốc, purchaseOrder, định nghĩa một namespace mặc định của “http://www.w3.org/2001/XMLSchema/po.xsd”, phù hợp với namespace đích của po.xsd schema. Theo cách đó, một bộ kiểm chứng schema có thể đảm bảo rằng tài liệu XML tuân theo chuẩn – có nghĩa là, sau quá trình kiểm chứng, bộ kiểm chứng sẽ cố gắng thu được định nghĩa schema phù hợp với namespace này.

        * Một tiền tố namespace xsi được khai báo và chấp nhận cho tiền tố trong tài liệu XML tương ứng.

        * Với thuộc tính schemaLocation, bạn có thể định nghĩa một gợi ý cho bộ kiểm chứng schema để truy cập tới định nghĩa schema . Đây là một ví dụ của thuộc tính có tiền tố. Giá trị là một danh sách ngăn cách nhau bởi dấu trắng, ánh xạ một namespace tới một URI.

        * Các phần tử purchaseOrder, billTo, và shipTo, thuộc về namespace mặc định vì purchaseOrder định nghĩa một namespace mặc định, không bị ghi đè bởi bất kỳ phần tử con nào của nó.

        * Thuộc tính orderDate không nằm trong một namespace vì namespace mặc định không áp dụng cho các thuộc tính.

    Lưu ý: Các thuộc tính có thể không sử dụng namespace mặc định. Nếu bạn định nghĩa một tiền tố cho namespace mặc định và gắn tiền tố đó vào thuộc tính orderDate thì một lỗi kiểm chứng sẽ xuất hiện vì orderDate không nằm trong namespace.

    Xếp trong: , , ,
    • Điểm bài gửi: 3
Trang 1 trên 1
Tầng 3, Tòa nhà Sholega, số 275 Lạch Tray, Ngô Quyền, Hải Phòng
Tel: +84 (31) 3.733.000 - 3.733.111      Fax: +84 (31) 3.733.222
Email: center@hp-aptech.edu.vn
© 2004-2008 HaiPhong - Aptech Computer Education Giới thiệu  |  Liên hệ