XML Namespaces
- 16-06-2023
- Toanngo92
- 0 Comments
Mục lục
XML Namespaces (không gian tên XML)
Tên phần tử trùng lặp
XML cho phép các nhà phát triển tạo các phần tử và thuộc tính riêng cho các dự án của riêng họ. Các yếu tố hoặc thuộc tính này có thể được chia sẻ bởi các nhà phát triển làm việc trên các dự án tương tự trên toàn thế giới.
Ví dụ: một tác giả của tài liệu XML bao gồm phần tử có tên trong phần tử <CD> và một tác giả khác tạo phần tử <title> trong phần tử <Book>. Một vấn đề sẽ phát sinh nếu phần tử <title> được tạo bởi hai tác giả khác nhau, được hợp nhất vào một tài liệu XML duy nhất. Nhà phát triển XML phải đảm bảo tính duy nhất của tên thành phần và thuộc tính trong tài liệu.
Hậu quả của vấn đề trùng lặp tên phần tử
Khi các tác giả bắt đầu tích hợp các tài liệu XML từ các nhà phát triển khác nhau, xung đột tên là không thể tránh khỏi. Trong trường hợp như vậy, trình duyệt sẽ khó phân biệt được phần tử xung đột trong tài liệu XML.
Hãy xem xét một ví dụ trong đó có hai lần xuất hiện của phần tử trong một tài liệu XML, một gợi ý tiêu đề của đĩa CD trong khi một lần gợi ý tiêu đề của một cuốn sách. Hãy tưởng tượng rằng một ứng dụng có nhiệm vụ truy cập vào tài liệu này và tìm kiếm phần tử <title>. Trình phân tích cú pháp XML sẽ không tim thấy, gặp lỗi nếu nó không nhận được thông tin bổ sung để tìm kiếm một tiêu đề cụ thể
Ví dụ mô tả:
Namespaces
Trong XML, các phần tử được phân biệt bằng cách sử dụng các namespace (không gian tên). namespace XML cung cấp một tên duy nhất trên toàn cục cho một phần tử hoặc thuộc tính để chúng không xung đột với nhau.
Namespace là một tập hợp các tên có thể được sử dụng làm tên phần tử hoặc tên thuộc tính trong tài liệu XML.
Namespace XML cung cấp các ưu điểm sau:
- Khả năng tái sử dụng
- XML namespace cho phép tái sử dụng đánh dấu bằng cách sử dụng các thành phần và thuộc tính đã được xác định trước đó.
- Tính mô đun
- Các phiên mã có thể tái sử dụng có thể được viết và chúng có thể được gọi cho các phần tử hoặc thuộc tính cụ thể. Các thành phần và thuộc tính từ các mô-đun khác nhau có thể được tích hợp vào một tài liệu XML duy nhất. Các tên và thuộc tính phần tử duy nhất trên toàn cục đảm bảo rằng các mô-đun như vậy có thể được gọi cho các phần tử và thuộc tính nhất định.
- Mở rộng
- XML namespace cung cấp cho các tài liệu XML khả năng nhúng các phần tử và thuộc tính từ các từ vựng khác như MathML, XHTML (HTML mở rộng), v.v.
Lưu ý: Một namespace được xác định bởi Uniform Resource Identifier (URI). Ví dụ: chúng ta có thể có cả ba yếu tố được đặt tên là ‘batch’ (‘lô’). Đầu tiên giới thiệu phim ảnh,
lô thứ hai là sản phẩm và lô thứ ba là khách du lịch. Lô phần tử có thể được xác định bằng một URI duy nhất như đã cho.
http://www.movie.batch
http://www.tea.org.batch
http://www.tourism.org.batch
Cú pháp namespace
Tiền tố tên phần tử
Namespace là một cơ chế theo đó tên phần tử và thuộc tính có thể được gán cho các nhóm. Nó cũng đảm bảo rằng không có xung đột trong tên phần tử. Cách tốt nhất để giải quyết vấn đề này là cho mọi
phần tử trong một tài liệu để có một tên hoàn toàn khác biệt. Do đó, tiền tố Namespace XML được gắn trực tiếp vào tên cũng như tên của các thuộc tính và hậu duệ (phần tử con cháu) của nó.
Sử dụng tiền tố trong tên thành phần cung cấp ngữ nghĩa cho tác giả tài liệu để ngăn xung đột tên, như được minh họa trong đoạn mã dưới:
<CD:Title>Xin chao the gioi</CD:Title>
<Book:Title>300 bai code thieu nhi</Book:Title>
Các vấn đề do tiền tố gây ra
Có một nhược điểm đối với cách tiếp cận tiền tố của các namespace trong tài liệu XML. Lý do thêm tiền tố vào một phần tử trong tài liệu XML là để ngăn không cho nó bị trùng lặp. Tuy nhiên, nếu các tiền tố không phải là duy nhất, vấn đề trùng lặp ban đầu vẫn sẽ tồn tại.
Để giải quyết vấn đề này, mỗi tiền tố namespace được thêm vào Uniform Resource Identifier (URI) xác định duy nhất cho namespace. URI là một dãy ký tự dùng để phân biệt tên.
Ví dụ:
<?xml version="1.0" encoding="utf-8" ?>
<S:Student xmlns:S="http://www.example.com/Student">
<S:First>John</S:First>
<S:Last>Doe</S:Last>
<S:Title>Student</S:Title>
</S:Student>
Lưu ý: namespace prefix là chữ viết tắt của định danh namespace (URI). Đối với ứng dụng của Student, có thể chọn tiền tố S hoặc s. Các phần tử có tiền tố S được cho là có tên đủ điều kiện. Phần tên sau dấu hai chấm gọi là local name (tên cục bộ).
Cú pháp namespace
Thuộc tính namespace XML được đặt trong thẻ bắt đầu của một phần tử và cú pháp cho namespace mô tả như hình dưới:
namespacePrefix
Mỗi namespace có một tiền tố được sử dụng làm tham chiếu đến namespace. Tiền tố không được bắt đầu bằng xmlns hoặc xml. Tiền tố namespace có thể là bất kỳ tên XML hợp pháp nào không chứa dấu hai chấm. Tên XML hợp pháp phải bắt đầu bằng một chữ cái hoặc dấu gạch dưới.
elementName
Chỉ định tên của phần tử.
xmlns
Thuộc tính xmlns là thuộc tính thông báo cho bộ xử lý XML rằng một namespace đang được khai báo. xmlns là viết tắt của XML namespace.
URI
Mã định danh tài nguyên thống nhất (Uniform Resource Identifier – URI) là một chuỗi ký tự xác định Tài nguyên Internet. URI bao gồm Tên tài nguyên thống nhất (Uniform Resource Name – URN) và Bộ định vị tài nguyên thống nhất (Uniform Resource Locator – URL). URL chứa tham chiếu cho tài liệu hoặc trang HTML trên Web. URN là một số duy nhất toàn cầu xác định các tài nguyên Internet. Ngoài ra, URI cũng phân biệt chữ hoa chữ thường, có nghĩa là hai không gian tên sau đây khác nhau: http://www.XMLNAMESPACES.com, http://www.xmlnamespaces.com.
Mục đích của các namespace, khi được sử dụng trong tài liệu XML, là để ngăn chặn sự xung đột của các phần tử và tên thuộc tính tương tự. Một namespace trong XML chỉ đơn giản là một tập hợp các phần tử và tên thuộc tính được xác định bởi một tham chiếu URI. Một tham chiếu URI mang ý nghĩa gì ngoài một mã định danh chuỗi.
Một URI không cần phải hợp lệ, có thể không có trang Web thực sự có tên http://wew.xmlnamespaces.com. Đặc biệt, các URI không cần phải hợp lệ hoặc trỏ đến một tài nguyên thực tế.
URI không cần thiết phải hợp lệ, do đó, các XML namespace coi chúng giống như các chuỗi. Đặc biệt, so sánh được thực hiện theo từng ký tự. Theo định nghĩa này, các URI sau không giống nhau mặc dù chúng trỏ đến cùng một tài liệu: http://xmlnamespaces.com, http://xmlnamespaces.com.
Ví dụ:
<?xml version="1.0" encoding="utf-8" ?>
<Auc:Books xmlns:Auc="http://www.auction.com/books"
xmlns:B="http://www.boooks.com/HTML/1998/xml1"
>
<Auc:BookReview>
<B:Table>
<B:Title>XML Developer's Guide</B:Title>
<B:Author>John Doe</B:Author>
<B:Date>January 2000</B:Date>
</B:Table>
</Auc:BookReview>
</Auc:Books>
Các phần tử có tiền tố Auc được liên kết với một namespace có tên http://www-auction.com/books, trong khi những phần tử có tiền tố B được liên kết với một không gian tên có tên là http://www.books.com/HTML/1998/xml1
Lưu ý: URI bao gồm cả URL và URN. URN khác với URL ở chỗ URL mô tả vị trí thực của tài nguyên cụ thể, trong khi URN xác định tên duy nhất không phụ thuộc vào vị trí cho tài nguyên ánh xạ tới một hoặc nhiều URL. Tất cả các URL đều bắt đầu bằng tiền tố dịch vụ Intemet, chẳng hạn như ftp:,https, v.v., trong khi URN bắt đầu bằng tiền tố urn:.
Đặt các attributes (thuộc tính) trong một namespace (không gian tên)
Các thuộc tính thuộc về các phần tử cụ thể và chúng không phải là một phần của namespace, ngay cả khi phần tử nằm trong một số namespace. Tuy nhiên, nếu một tên thuộc tính không có tiền tố, nó sẽ không có namespace. Một thuộc tính không có tiền tố nằm trong namespace mặc định. Nếu một tên thuộc tính có tiền tố, thì tên của nó nằm trong namespace được chỉ định bởi tiền tố.
Cú pháp:
prefix:localname='value'
hoặc
prefix:localname="value"
Trong đó:
- prefix được sử dụng làm tham chiếu đến namespace. prefix không được bắt đầu bằng xmlns hoặc xml.
- localname Là tên của một thuộc tính.
- value đề cập đến một giá trị do người dùng xác định cho một thuộc tính.
Ví dụ:
<?xml version="1.0" encoding="utf-8" ?>
<Catalog xmlns:Book="http://web888book.com">
<Book:BookList>
<Book:Title Book:Type="Fiction">Evening in Paris</Book:Title>
<Book:Price>$123</Book:Price>
</Book:BookList>
</Catalog>
Lưu ý: Các thuộc tính từ một namespace chung cũng có thể được thêm vào các phần tử từ một namespace khác, ví dụ sau minh họa khái niệm này.
<?xml version="1.0" encoding="utf-8" ?>
<Catalog xmlns="http://web888book.com" xmlns:Author="http://toanngo92.web888.vn">
<Book Type="Adventure">The Last Samurai</Book>
<Book Author:Type="Fiction">Hannibal</Book>
<Book>American Dream</Book>
</Catalog>
Default Namespaces (namespace mặc định)
Xét một tài liệu XML chứa thông tin chi tiết về tất cả các cuốn sách trong thư viện. Do tài liệu này bao gồm rất nhiều markup, tất cả đều nằm trong cùng một namespace nên có thể không thuận tiện khi thêm tiền tố vào mỗi tên thành phần. Hãy xem xét một kịch bản khác trong đó một tài liệu XML sẽ hợp nhất với tài liệu MathML.
Vấn đề này có thể được giải quyết bằng cách thêm một namespace mặc định vào một phần tử và các phần tử con của nó bằng thuộc tính xmlns không có tiền tố.
Một namespace mặc định được sử dụng bởi một phần tử và các phần tử con của nó nếu phần tử không có tiền tố namespace.
Tài liệu MathML
Ngôn ngữ đánh dấu toán học (MathML là ngôn ngữ đánh dấu dựa trên XML để biểu diễn các biểu thức toán học phức tạp. Nó có hai loại, là ngôn ngữ đánh dấu để trình bày bố cục của các biểu thức toán học và là ngôn ngữ đánh dấu để trình bày nội dung toán học của công thức, Ví dụ: , biểu thức x + 1 có thể được viết bằng MathML, như được minh họa trong đoạn mã sau:
Cú pháp:
Cú pháp của một default namespace như sau:
<elementName xmlns='URL'>
Trong đó:
- ElementName chỉ định tên của phần tử thuộc cùng một namespace.
- URL chỉ định không gian tên tham chiếu cho tài liệu hoặc trang HTML trên Web.
Ví dụ:
<?xml version="1.0" encoding="utf-8" ?>
<Catalog xmlns="https://hocvietcode.com">
<BookList>
<Title Type="Thriller">African Safari</Title>
<Price>$123</Price>
<ISBN>123456789</ISBN>
</BookList>
</Catalog>
Default namespace sử dụng thuộc tính xmlns với URI làm giá trị của nó. Khi default namespace này được khai báo, các phần tử con là một phần của namespace này không cần tiền tố namespace.
Ghi đè default namespaces
Default namespace áp dụng cho phần tử mà nó được xác định và tất cả các hậu duệ của phần tử đó. Nếu một trong các phần tử con có một Default namespace khác được xác định trên nó, thì định nghĩa namespace mới này sẽ ghi đè phần tử trước đó và trở thành mặc định cho phần tử đó và tất cả các phần tử con của nó như được minh họa trong đoạn mã sau:
<?xml version="1.0" encoding="utf-8" ?>
<Catalog xmlns="https://hocvietcode.com">
<Book>
<Title type="Fiction">Evening in Paris</Title>
<Price>$123</Price>
</Book>
<Book>
<Title type="Non-fiction">African Safari</Title>
<Price xmlns="http://laptopcutot.com">$23</Price>
</Book>
</Catalog>
Lưu ý rằng trong phần tử Price trong phần tử Book thứ hai, một namespace khác được cung cấp. Namespace này chỉ áp dụng cho phần tử Price và ghi đè namespace trong phần tử Catalog.
Các phương pháp hay nhất để sử dụng XML namespace
- Namespace nên được lên kế hoạch hợp lý,
- Tên tiền tố hợp lý và nhất quán nên được sử dụng để thuận tiện trong khi tạo tài liệu XML
- Namespace nên được áp dụng cho từ vựng cá nhân, ngay cả khi chỉ có một.
- Namespace nên được sử dụng để phân tách hoặc cô lập các phần tử có vẻ giống nhau.
- Khi thiết kế hai từ vựng có một số thành phần chung, nên sử dụng một namespace để chứa các mục chung.
- URL HTTP nên được sử dụng cho các URI.
- Các URI nên được phối hợp bằng cách đặt tên theo một tên miền cụ thể.
- URI namespace nên thay đổi đối với mọi thay đổi quan trọng đối với từ vựng, bao gồm bổ sung và xóa các yếu tố mới,
- Nếu có thể, nên sử dụng một tiền tố cho một namespace xuyên suốt tất cả các tài liệu XML trong một hệ thống.
- Các khai báo namespace phải được thực hiện trong thẻ bắt đầu của thành phần tài liệu.
- Nên sử dụng các tên miền như namespaces.com, namespaces.net hoặc namespaces.org