Namespace trong xml (Bài 3)

0
59
Rate this post

Trong lĩnh vực XML, việc sử dụng namespace là một phương pháp thông minh giúp chúng ta phân biệt giữa các phần tử cùng tên nhưng khác nhau về ý nghĩa, số lượng hoặc tên phần tử con. Điều này tránh xảy ra xung đột tên trong quá trình kết hợp các tài liệu XML từ các ứng dụng khác nhau.

Giới thiệu về Namespace trong xml

Trong ngôn ngữ lập trình XML, tên của một phần tử được đặt bởi các nhà phát triển. Điều này dẫn đến một vấn đề tiềm tàng khi chúng ta muốn kết hợp các tài liệu XML từ các ứng dụng XML khác nhau. Trong ví dụ sau đây, chúng ta sẽ thấy rõ vấn đề này:

<?xml version="1.0" encoding="UTF-8"?>
<doc>
  <!-- Thông tin về một cái bàn (đồ nội thất) -->
  <table>
    <name>African Coffee Table</name>
    <width>80</width>
    <length>120</length>
  </table>
  <!-- Thông tin về một bảng HTML -->
  <table>
    <tr>
      <td>Apples</td>
      <td>Bananas</td>
    </tr>
  </table>
</doc>

Trong ví dụ trên, chúng ta có 2 cặp thẻ <table> được gộp từ 2 ứng dụng khác nhau và dẫn đến sự xung đột về tên. Mặc dù chúng ta có thể thấy rõ rằng cả hai đều là bảng, nhưng chúng lại mang ý nghĩa và số lượng/tên phần tử con khác nhau.

Giải quyết xung đột tên phần tử bằng Namespace

Để giải quyết vấn đề xung đột tên phần tử, chúng ta có thể sử dụng tiếp đầu ngữ (Prefix) để xác định các dữ liệu khác nhau của cùng một phần tử trong cùng một tài liệu.

Cú pháp khai báo namespace như sau: xmlns:prefix="URI". Trong đó, URI là một chuỗi ký tự giúp xác định một tài nguyên Internet, thông thường chúng ta sẽ sử dụng Uniform Resource Locator (URL) để xác định một địa chỉ miền trên Internet.

Ví dụ về cách sử dụng Namespace trong xml:

<?xml version="1.0" encoding="UTF-8"?>
<doc xmlns:h="http://localhost/html" xmlns:f="http://localhost/furniture">
  <f:table>
    <f:name>African Coffee Table</f:name>
    <f:width>80</f:width>
    <f:length>120</f:length>
  </f:table>
  <h:table>
    <h:tr>
      <h:td>Apples</h:td>
      <h:td>Bananas</h:td>
    </h:tr>
  </h:table>
</doc>

Trong ví dụ trên, việc khai báo namespace được thực hiện ở phần tử gốc (root) là <doc>. Điều này giúp chúng ta phân biệt được rõ ràng giữa các phần tử có cùng tên, như <table> trong ngữ cảnh khác nhau.

Ngoài ra, chúng ta cũng có thể khai báo namespace tại phần tử thành viên. Ví dụ:

<?xml version="1.0" encoding="UTF-8"?>
<doc>
  <f:table xmlns:f="http://localhost/furniture">
    <f:name>African Coffee Table</f:name>
    <f:width>80</f:width>
    <f:length>120</f:length>
  </f:table>
  <h:table xmlns:h="http://localhost/html">
    <h:tr>
      <h:td>Apples</h:td>
      <h:td>Bananas</h:td>
    </h:tr>
  </h:table>
</doc>

Như bạn có thể thấy trong ví dụ trên, chúng ta khai báo namespace trực tiếp trong từng phần tử để xác định rõ ràng phạm vi của namespace đó. Điều này giúp chúng ta tăng tính linh hoạt và khả năng tái sử dụng khi xử lý các tài liệu XML phức tạp.

Namespace trong xml – Bài tập thực hành

Giả sử chúng ta cần tạo một tài liệu XML có tên là “Order.xml” để lưu trữ các thông tin đơn đặt hàng. Cấu trúc của tài liệu gồm:

  • Invoice
  • Order (Có một thuộc tính là OrderNumber) và các phần tử con
    • Customer name
    • Address
    • Order id
    • Total Price
  • Cod
    • Shipping Address
    • Shipping Method (Air hoặc Ground)
    • Shipping total
  • Account (Có một thuộc tính là State với giá trị là active hoặc no. Giá trị mặc định là active)
    • Customer ID
    • Invoice period
  • Shipping info
    • Ship date
    • Billing Address (Phần tử này tuỳ vào chi nhánh mà có thể có hoặc không)
  • Description (Miêu tả về sản phẩm)

Giả sử chúng ta có 5 chi nhánh và mỗi chi nhánh sẽ có một tài liệu Invoice riêng. Cuối mỗi tháng, trụ sở chính sẽ nhận được 5 tài liệu XML từ 5 chi nhánh và tiến hành gộp chúng vào một tài liệu XML duy nhất.

Tuy nhiên, câu hỏi đặt ra là liệu có xảy ra xung đột tên khi tiến hành gộp 5 tài liệu XML từ 5 chi nhánh theo cấu trúc trên hay không? Nếu có, bạn sẽ giải quyết như thế nào?

Để giải quyết vấn đề này, chúng ta có thể sử dụng Namespace để phân biệt rõ ràng giữa các phần tử có cùng tên trong từng tài liệu XML chi nhánh. Điều này giúp chúng ta tránh xảy ra xung đột tên phần tử và đồng thời giữ được tính chất rõ ràng và tái sử dụng trong quá trình xử lý các tài liệu XML phức tạp.

Đọc thêm về vấn đề này tại Dnulib.

Được chỉnh sửa bởi Dnulib vào cuối mỗi bài viết.