Công nghệ XML: các thành phần và thuộc tính để triển khai các dịch vụ web. Thuộc tính XML

Các phần tử tài liệu XML

Một tệp XML bao gồm văn bản và đánh dấu. Văn bản được đặt trong yếu tố, bắt đầu và kết thúc bằng thẻ.

Yếu tố Nó có Tên(Cái này loại nguyên tố), đặt trong dấu ngoặc nhọn<>, chỉ định thẻ bắt đầu và thẻ kết thúc (bộ mô tả). Tên (loại phần tử) phân biệt chữ hoa chữ thường. Tên phần tử có thể bắt đầu bằng một chữ cái, dấu gạch dưới (_) hoặc dấu hai chấm (:) và không thể bắt đầu bằng tổ hợp chữ cái “xml”.

Thẻ kết thúc (bộ mô tả) cũng có dấu gạch chéo về phía trước.

Yếu tố có thể chứa một thẻ (bộ mô tả) có dấu cách và dấu gạch chéo ở cuối:

Một phần tử bao gồm một thẻ (bộ mô tả) được gọi phần tử trống và từ hai thẻ và chứa bất kỳ dữ liệu nào - không trống rỗng.

Dấu ngoặc nhọn ở đầu phần mô tả (<) в языках разметки называется MDO (Markup Declaration Open – открытие декларации разметки), а в конце дискриптора (>) - được gọi là MDC (Đóng khai báo đánh dấu).

Một tài liệu XML được thiết kế tốt phải có phần tử gốc(phần tử gốc). Ngoài văn bản, bên trong phần tử gốc có thể có phần tử lồng nhau:

"Hướng dẫn XML"

Leontyev Alexey Georgievich

Chỉ được có một phần tử gốc trong một tệp XML. Trong ví dụ này là .

Các phần tử lồng nhau được gọi là công ty con các phần tử và các phần tử xung quanh chúng là cha mẹ các phần tử.

Yêu cầu này nảy sinh vì một tài liệu XML có thể được lồng trong một tài liệu khác. Trong trường hợp này, phần tử gốc của tài liệu lồng nhau sẽ đơn giản trở thành một trong các phần tử của tài liệu mà nó được lồng vào. Phần đính kèm như vậy sẽ không phá vỡ cấu trúc của tài liệu.

Tệp XML thường bắt đầu bằng Quảng cáo, còn được gọi là lời mở đầu(mở đầu). Lời mở đầu bao gồm hai phần.

Phần đầu tiên mở đầu bao gồm Khai báo XML (Khai báo XML). Tuyên bố được đặt giữa các ký hiệu, chứa thẻ xml và số phiên bản của đặc tả XML. Nó có thể bao gồm các chỉ dẫn về mã hóa ký tự trong đó văn bản được viết. Bạn cũng có thể thêm một tham số độc lập vào phần khai báo với các giá trị "có" hoặc "không". Giá trị "không" chỉ ra rằng tài liệu sử dụng các định nghĩa phần tử được tạo trong tài liệu khác, bên ngoài. Giá trị mặc định là có". Vì vậy, khai báo XML hoàn chỉnh có thể trông như thế này:

Phần thứ hai mở đầu - thông báo loại tài liệu, DTD(Khai báo loại tài liệu) - có thể chiếm một hoặc nhiều dòng. Phần này khai báo các thẻ được sử dụng trong tài liệu hoặc cung cấp liên kết đến tệp trong đó các khai báo đó được ghi lại. Khai báo loại tài liệu bắt đầu bằng các ký tự. Nội dung của nó phụ thuộc vào cách các thẻ được khai báo.

Tất cả điều này cùng nhau trông như thế này:

Ví dụ này xem xét phiên bản đầu tiên của XML và mã hóa ký tự tiếng Nga dành cho hệ điều hành Windows. Đối với hệ điều hành UNIX, mã hóa tiếng Nga là "KOI8-R". Bạn có thể sử dụng mã hóa phổ quát "UTF-8" cho Unicode.

Các quy tắc mô tả các thành phần của tệp hướng dẫn XML nằm trong thư mục HỆ THỐNG chứ không phải trong thư mục CÔNG CỘNG chung trong tên tệp.dtd.

Trong ví dụ, theo quy tắc, tên của tài liệu XML hướng dẫn giống với tên của phần tử gốc.

Thuộc tính tài liệu XML

Các thuộc tính bao gồm tên và giá trị, trong đó giá trị được đặt trong dấu ngoặc kép ("). Thuộc tính cho phép bạn lưu trữ các tham số bổ sung bằng một phần tử. Một thuộc tính (hoặc một số thuộc tính) được chỉ định bên trong thẻ bắt đầu của phần tử. Khi thêm nhiều thuộc tính thuộc tính, chúng được phân tách bằng dấu cách:

Tên thuộc tính có thể chứa các ký tự giống như tên thành phần, với cùng quy tắc loại trừ khoảng trắng và bắt đầu tên bằng một chữ cái.

Các giá trị thuộc tính có thể được đặt trong dấu ngoặc đơn (dấu nháy đơn) hoặc dấu ngoặc kép. Ngoài ra, cũng có thể sử dụng một số dấu ngoặc kép bên trong những dấu ngoặc kép khác:

< thuộc tính myElement=""giá trị"" >< /phần tử của tôi >

Nếu giá trị thuộc tính chứa dấu ngoặc kép thì nó phải được đặt trong dấu nháy đơn; nếu giá trị chứa dấu nháy đơn thì nó phải được đặt trong dấu nháy đơn. Nếu dấu ngoặc kép và dấu nháy đơn đã được sử dụng để giới hạn giá trị thuộc tính thì bên trong giá trị, dấu ngoặc kép có thể được thay thế bằng tham chiếu đến thực thể " , và dấu nháy đơn là một liên kết " . Thay vì tham chiếu thực thể, bạn có thể viết mã trích dẫn và dấu nháy đơn— " " . Ở dạng thập lục phân, mã trích dẫn và dấu nháy đơn trông như thế này: x22;x27;.

Khi nghĩ về việc đánh dấu tài liệu và tạo thẻ, câu hỏi luôn đặt ra là đặt thông tin này hoặc thông tin kia ở đâu: trong nội dung của phần tử hay trong các thuộc tính của nó? Câu trả lời rất mơ hồ, nó phụ thuộc vào bản thân thông tin và mục đích đánh dấu của nó, và thường nó chỉ đơn giản là vấn đề sở thích.

Các thuộc tính rất hữu ích để mô tả các giá trị đơn giản. Hầu hết mọi công dân Nga đều phải có một tên, một họ và một họ. Thật thuận tiện khi viết chúng ra dưới dạng thuộc tính. Nhưng một công dân Nga có thể có nhiều điện thoại, vì vậy sẽ thuận tiện hơn nếu sắp xếp số của họ thành các phần tử < điện thoại cơ quan > < điện thoại nhà > , lồng trong một phần tử < danh sách điện thoại > , không phải thuộc tính thẻ mở < danh sách điện thoại > . Lưu ý rằng phần tử < tên > với thuộc tính trống, nó không có nội dung nên không cần thẻ đóng. Vì thế thẻ < tên > với các thuộc tính kết thúc bằng " /> ". Ví dụ về tài liệu XML có các thuộc tính trong thẻ mở:

< sổ tay >

< người >

< />

< sinh nhật > 25.03.1977 sinh nhật >

< Địa chỉ >

< đường phố > Sadovaya, 23-15 đường phố >

< thành phố > Saint Petersburg thành phố >

< zip > 123456 zip>

Địa chỉ >

< danh sách điện thoại >

< điện thoại cơ quan>2654321 điện thoại cơ quan >

< điện thoại cơ quan>2654 023 điện thoại cơ quan >

< điện thoại nhà>34567 81 điện thoại nhà >

danh sách điện thoại >

người >

< người >

< tên đầu tiên="Mapiya" seсond="Petrovna" họ="Sidorova" />

< sinh nhật > 17.05.1969 sinh nhật >

< Địa chỉ >

< đường phố > Malinovskaya, 17 đường phố >

< thành phố>Puskin thành phố >

< zip > 234561 zip >

Địa chỉ >

< danh sách điện thoại >

< điện thoại nhà > 2334455điện thoại nhà >

danh sách điện thoại >

người >

sổ tay >

Trong ví dụ này, hai dòng đầu tiên là phần mở đầu (khai báo, định nghĩa).

Yếu tố < tên đầu tiên="Ivan" seсond="Petrovich" họ="Sidorov" /> - trống và chứa ba thuộc tính.

Yếu tố < người > lặp lại hai lần và là cha của các phần tử: < tên />, < sinh nhật > , < Địa chỉ >, < danh sách điện thoại>. Một số phần tử này lần lượt là phần tử cha.

Thuộc tính thẻ mở cũng hữu ích cho việc chỉ định loại phần tử. Ví dụ: chúng tôi không xác định rõ người thân của chúng tôi sống ở thành phố, thị trấn hay làng. Có thể được nhập vào thẻ mở < thành phố > thuộc tính loại lấy một trong các giá trị thành phố, thị trấn, làng. Ví dụ:

< loại thành phố="thành phố" > Mátxcơva thành phố >

Như bạn có thể thấy, các giá trị thuộc tính có thể được viết không chỉ bằng tiếng Latinh mà còn bằng các chữ cái tiếng Nga. Đặc tả XML cho phép sử dụng hầu hết tất cả các ký tự Unicode để ghi các giá trị thuộc tính và nội dung phần tử.


Thông tin liên quan.


Chúng ta tiếp tục nghiên cứu về XML một lần nữa và trong bài viết này chúng ta sẽ làm quen với các cấu trúc XML như hướng dẫn xử lý, nhận xét, thuộc tính và các phần tử XML khác. Những yếu tố này là cơ bản và cho phép bạn linh hoạt, tuân thủ nghiêm ngặt tiêu chuẩn, đánh dấu các tài liệu có độ phức tạp hoàn toàn.

Chúng tôi đã thảo luận một phần về một số điểm, chẳng hạn như thẻ XML, trong bài viết trước “Đánh dấu tài liệu XML”. Bây giờ chúng ta sẽ đề cập lại chủ đề này và xem xét nó chi tiết hơn. Điều này được thực hiện cụ thể để giúp bạn dễ dàng có được bức tranh đầy đủ về cấu trúc XML.

Như đã đề cập trong bài viết trước, các thẻ trong XML không chỉ đánh dấu văn bản như trong HTML mà còn làm nổi bật các phần tử (đối tượng) riêng lẻ. Đổi lại, các phần tử sắp xếp thông tin theo thứ bậc trong tài liệu, từ đó biến chúng thành đơn vị cấu trúc chính của ngôn ngữ XML.

Trong XML, các phần tử có thể có hai loại - trống và không trống. Các phần tử trống không chứa bất kỳ dữ liệu nào, chẳng hạn như văn bản hoặc các cấu trúc khác. Không giống như các phần tử trống, các phần tử không trống có thể chứa bất kỳ dữ liệu nào, chẳng hạn như văn bản hoặc các phần tử và cấu trúc XML khác. Để hiểu ý ở trên, chúng ta hãy xem các ví dụ về các phần tử XML trống và không trống.

Phần tử XML trống

Phần tử XML không trống

Nội dung phần tử...

Như chúng ta có thể thấy từ ví dụ trên, sự khác biệt chính giữa các phần tử trống và phần tử không trống là chúng chỉ bao gồm một thẻ. Ngoài ra, cũng cần lưu ý rằng trong XML tất cả các tên đều phân biệt chữ hoa chữ thường. Điều này có nghĩa là các tên myElement, MyElement, MYELEMENT, v.v. khác nhau nên cần ghi nhớ ngay khoảnh khắc này để tránh mắc sai lầm về sau. Vì vậy, chúng tôi đã tìm ra các yếu tố. Bây giờ chúng ta hãy chuyển sang điểm tiếp theo, đó là cách tổ chức logic của các tài liệu XML.

Tổ chức logic của các tài liệu XML. Cấu trúc cây của dữ liệu XML

Như bạn nhớ, cấu trúc chính của ngôn ngữ XML là các phần tử, chúng có thể chứa các cấu trúc lồng nhau khác và do đó tạo thành cấu trúc phân cấp dưới dạng cây. Trong trường hợp này, phần tử cha sẽ là gốc và tất cả các phần tử con khác sẽ là nhánh và lá của cây XML.

Để dễ hiểu hơn về bản chất của những điều trên, chúng ta hãy xem hình ảnh sau đây với một ví dụ.

Như chúng ta có thể thấy, việc tổ chức một tài liệu XML dưới dạng cây là một cấu trúc khá đơn giản để xử lý. Đồng thời, độ phức tạp biểu đạt của bản thân cây cũng khá lớn. Biểu diễn cây là cách tối ưu nhất để mô tả các đối tượng trong XML.

Thuộc tính XML. Quy tắc viết thuộc tính trong XML

Trong XML, các phần tử cũng có thể chứa các thuộc tính với các giá trị được gán cho chúng, được đặt trong dấu ngoặc đơn hoặc dấu ngoặc kép. Thuộc tính cho một phần tử được đặt như sau:

Trong trường hợp này, một thuộc tính có tên “thuộc tính” và giá trị “giá trị” đã được sử dụng. Cần lưu ý ngay rằng thuộc tính XML phải chứa một số giá trị và không được để trống. Nếu không, mã sẽ không chính xác theo quan điểm XML.

Nó cũng đáng chú ý đến việc sử dụng dấu ngoặc kép. Giá trị thuộc tính có thể được đặt trong dấu ngoặc đơn hoặc dấu ngoặc kép. Ngoài ra, cũng có thể sử dụng một số dấu ngoặc kép bên trong những dấu ngoặc kép khác. Để chứng minh, hãy xem xét các ví dụ sau.

Trước khi chúng ta xem xét các cấu trúc XML khác, cũng cần lưu ý rằng khi tạo thuộc tính, các ký tự đặc biệt như dấu và "&" hoặc dấu ngoặc nhọn " không thể được sử dụng làm giá trị.<>" Các ký tự này được dành riêng làm ký tự điều khiển (“&” là một thực thể và “<» и «>» mở và đóng thẻ phần tử) và không thể được sử dụng ở dạng thuần túy của nó. Để sử dụng chúng, bạn cần dùng đến cách thay thế các ký tự đặc biệt.

Hướng dẫn xử lý XML (hướng dẫn xử lý). Khai báo XML

XML có khả năng bao gồm các hướng dẫn trong tài liệu mang thông tin cụ thể cho các ứng dụng sẽ xử lý một tài liệu cụ thể. Hướng dẫn xử lý trong XML được tạo như sau.

Như bạn có thể thấy từ ví dụ trên, trong XML, các hướng dẫn xử lý được đặt trong dấu ngoặc kép ở góc có dấu chấm hỏi. Điều này hơi giống một khối PHP thông thường mà chúng ta đã xem xét trong các bài học PHP đầu tiên. Phần đầu tiên của lệnh xử lý chỉ định ứng dụng hoặc hệ thống mà phần thứ hai của lệnh này hoặc nội dung của nó hướng tới. Tuy nhiên, hướng dẫn xử lý chỉ có hiệu lực đối với những ứng dụng mà chúng được xử lý. Một ví dụ về lệnh xử lý có thể là lệnh sau.

Điều đáng lưu ý là XML có một cấu trúc đặc biệt rất giống với một lệnh xử lý, nhưng bản thân nó không phải là một cấu trúc đó. Chúng ta đang nói về một khai báo XML truyền đến phần mềm xử lý một số thông tin về các thuộc tính của tài liệu XML, chẳng hạn như mã hóa, phiên bản ngôn ngữ mà tài liệu được viết, v.v.

Như bạn có thể thấy từ ví dụ trên, khai báo XML chứa cái gọi là thuộc tính giả, rất giống với các thuộc tính thông thường mà chúng ta đã nói ở trên. Thực tế là, theo định nghĩa, một khai báo và hướng dẫn xử lý XML không thể chứa các thuộc tính, vì vậy những khai báo này được gọi là thuộc tính giả. Điều này đáng ghi nhớ cho tương lai để tránh những sai lầm khác nhau.

Vì chúng ta đã xử lý các thuộc tính giả nên hãy xem ý nghĩa của chúng.

Mã hóa - chịu trách nhiệm mã hóa tài liệu XML. Thông thường mã hóa UTF8 được sử dụng. Phiên bản – phiên bản ngôn ngữ XML mà tài liệu này được viết. Thông thường đây là phiên bản XML 1.0.

Chà, bây giờ chúng ta hãy chuyển sang phần kết luận của bài viết và xem xét các cấu trúc XML như vậy dưới dạng các phần nhận xét và phần CDATA.

Xin chào, khách truy cập trang web thân yêu! Hãy tiếp tục chủ đề về ngôn ngữ đánh dấu XML và xem xét việc sử dụng các thuộc tính. Các thuộc tính có thể xuất hiện trong các phần tử XML, giống như trong HTML. Thuộc tính cung cấp thông tin bổ sung về một phần tử.

Thuộc tính XML

Trong HTML, các thuộc tính cung cấp thông tin bổ sung về các phần tử:

Thuộc tính XML phải được đặt trong dấu ngoặc kép

Giá trị thuộc tính trong xml phải luôn được đặt trong dấu ngoặc kép. Có thể sử dụng cả dấu ngoặc đơn và dấu ngoặc kép. Để chỉ ra giới tính của phần tử người, bạn có thể viết nó như thế này:

Nếu bản thân giá trị thuộc tính chứa dấu ngoặc kép, bạn có thể sử dụng dấu ngoặc đơn, như trong ví dụ này:

Các phần tử XML so với các thuộc tính

Hãy xem các ví dụ sau:

Victoria
Petrova

nữ giới
Victoria
Petrova

Trong ví dụ đầu tiên, giới tính là một thuộc tính. Ở phần sau, tình dục là một yếu tố. Cả hai ví dụ đều cung cấp thông tin giống nhau.

Không có quy tắc nào về thời điểm sử dụng thuộc tính và khi nào sử dụng phần tử. Các thuộc tính rất hữu ích trong HTML. Trong XML, tôi khuyên bạn nên tránh chúng. Thay vào đó hãy sử dụng các phần tử.

Con đường yêu thích của tôi

Ba tài liệu XML sau đây chứa thông tin giống hệt nhau:

Thuộc tính ngày XML được sử dụng trong ví dụ đầu tiên:

Phần tử ngày mở rộng được sử dụng trong phần tử thứ ba: (ĐÂY LÀ CÁCH YÊU THÍCH CỦA TÔI):



10
01
2008

Peter
Sveta
Lời nhắc nhở

Tránh các thuộc tính XML?

Một số vấn đề khi sử dụng thuộc tính xml:

  • thuộc tính không thể chứa nhiều giá trị (các phần tử có thể)
  • thuộc tính không thể chứa cấu trúc cây (các phần tử có thể)
  • các thuộc tính khó mở rộng hơn (đối với những thay đổi trong tương lai)

Đừng làm như thế này:

to="Vasya" from="Sveta" tiêu đề="Nhắc nhở"
body="Đừng quên gọi cho tôi vào ngày mai!"">

Thuộc tính XML cho siêu dữ liệu



Vasya
Sveta
Lời nhắc nhở
Đừng quên gọi cho tôi vào ngày mai!


Sveta
Vasya
Re: Nhắc nhở
ĐƯỢC RỒI

Các thuộc tính id ở trên được sử dụng để xác định các ghi chú khác nhau. Bản thân chúng không phải là một phần của ghi chú.

Điều tôi muốn nói ở đây là siêu dữ liệu (dữ liệu về dữ liệu) phải được lưu trữ dưới dạng thuộc tính xml và bản thân dữ liệu đó phải được lưu trữ dưới dạng phần tử.

Cám ơn vì sự quan tâm của bạn!.

Các phần tử XML có thể có các thuộc tính, giống như HTML.

Các thuộc tính được thiết kế để chứa dữ liệu cụ thể cho một phần tử cụ thể.

Các thuộc tính XML phải được đặt trong dấu ngoặc kép

Giá trị thuộc tính phải luôn được đặt trong dấu ngoặc kép. Có thể sử dụng dấu ngoặc đơn hoặc dấu ngoặc kép.

Vậy thì đối với giới tính của một người Phần tử có thể được viết như sau:

hoặc như thế này:

Nếu bản thân giá trị thuộc tính chứa dấu ngoặc kép, bạn có thể sử dụng dấu ngoặc đơn, như trong ví dụ này:

hoặc bạn có thể sử dụng các thực thể ký tự:

Các phần tử XML và thuộc tính

Hãy xem những ví dụ này:

Anna
thợ rèn


nữ giới
Anna
thợ rèn

Trong ví dụ đầu tiên, giới tính là một thuộc tính. Ở phần sau, tình dục là một yếu tố. Cả hai ví dụ đều cung cấp thông tin giống nhau.

Không có quy tắc nào về thời điểm sử dụng thuộc tính hoặc thời điểm sử dụng các phần tử trong XML.

Cách yêu thích của tôi

Ba tài liệu XML sau đây chứa thông tin giống hệt nhau:

Thuộc tính ngày được sử dụng trong ví dụ đầu tiên:


Tove
Jani

phần tử được sử dụng trong ví dụ thứ hai:


2008-01-10
Tove
Jani

Đã mở rộng phần tử được sử dụng trong ví dụ thứ ba: (ĐÂY LÀ YÊU THÍCH CỦA TÔI):



2008
01
10

Tove
Jani

Tránh các thuộc tính XML?

Một số điều cần cân nhắc khi sử dụng thuộc tính:

  • thuộc tính không thể chứa nhiều giá trị (các phần tử có thể)
  • thuộc tính không thể chứa cấu trúc cây (các phần tử có thể)
  • các thuộc tính không dễ dàng mở rộng (đối với những thay đổi trong tương lai)

Đừng kết thúc như thế này:

to="Tove" from="Jani" tiêu đề="Nhắc nhở"
body="Đừng quên tôi cuối tuần này!"">

Thuộc tính XML cho siêu dữ liệu



Tove
Jani
Lời nhắc nhở
Đừng quên tôi vào cuối tuần này nhé!


Jani
Tove
Re: Nhắc nhở
tôi sẽ không

thuộc tính id ở trên để xác định các ghi chú khác nhau. Bản thân nó không phải là một phần của ghi chú.

Điều tôi muốn nói ở đây là siêu dữ liệu (dữ liệu về dữ liệu) phải được lưu trữ dưới dạng thuộc tính và bản thân dữ liệu đó phải được lưu trữ dưới dạng phần tử.

Các yếu tố hoặc thuộc tính?

Cân nhắc thiết kế cho các định dạng XML

Điều bất thường về XML là ngôn ngữ này cung cấp hai cách gần như tương đương nhưng không hoàn toàn tương đương để viết cụm từ "đây là dữ liệu". Cách đầu tiên để chỉ định một giá trị dữ liệu là đặt nó vào một phần tử lồng nhau, cách thứ hai là gán nó cho một giá trị thuộc tính. Vì thường không có câu trả lời rõ ràng cho câu hỏi khi nào trong hai cách tiếp cận này là phù hợp nhất nên XML không hoàn toàn phù hợp. trực giao(trong lý thuyết lập trình, thuật ngữ này có nghĩa như sau: "mỗi cấu trúc thực hiện một việc và không có cấu trúc nào khác thực hiện điều tương tự"). Bài viết này cung cấp hướng dẫn về thời điểm sử dụng các phần tử lồng nhau và thời điểm sử dụng thuộc tính.

Lần duy nhất bạn không phải quyết định cách truyền dữ liệu là nếu bạn đã được giao một đặc tả phương ngữ XML để tuân thủ - được chỉ định dưới dạng Lược đồ XML DTD hoặc W3C hoặc được mô tả không chính thức hoặc bằng ví dụ. Vì vậy, nếu không cần thiết phải lựa chọn, hãy bỏ qua những gợi ý được đưa ra trong bài viết này. Tuy nhiên, các nhà phát triển thường phải phát triển phương ngữ XML chính xác để sử dụng để xử lý. Nếu đây là trường hợp của bạn, bài viết này là dành cho bạn.

Điều quan trọng cần nhớ là sự khác biệt giữa các tài liệu XML, vốn phải được định dạng chính xác một cách đơn giản và các tài liệu phải hợp lệ theo một số DTD/Lược đồ. Khả năng được chấp nhận là một tiêu chí nghiêm ngặt hơn nhiều: nó có thể được sử dụng để yêu cầu một số dữ liệu nhất định phải được trình bày và nó được cấu trúc theo một cách cụ thể. Vì lý do này mà cần phải nỗ lực nhiều hơn nữa để đảm bảo rằng quá trình tạo ra một tài liệu nhất định đáp ứng các điều kiện được chấp nhận. Cả hai cách tiếp cận đều có ưu điểm của chúng; Việc sử dụng DTD làm cho nhiệm vụ chọn thành phần/thuộc tính trở nên khó khăn hơn, nhưng cả hai trường hợp đều có ưu và nhược điểm. Hai lựa chọn thay thế này sẽ được thảo luận dưới đây.

Thứ tự của dữ liệu có quan trọng không?

Việc sử dụng DTD đảm bảo rằng các phần tử lồng nhau, không giống như các thuộc tính, được sắp xếp nghiêm ngặt. Chỉ trong các tài liệu XML được định dạng đúng, thứ tự mới có thể được thao tác tự do - trong trường hợp này, bất kỳ thẻ nào cũng có thể nằm bên trong bất kỳ thẻ nào khác, ở bất kỳ cấp độ lồng nhau nào. Trong cả hai trường hợp, các thuộc tính thường phù hợp hơn với dữ liệu không có thứ tự. Tuy nhiên, khi nói đến các tài liệu XML có DTD thì việc sử dụng các thuộc tính gần như là bắt buộc đối với kiểu dữ liệu này.

Ví dụ: hãy xem xét danh sách liên hệ (thông tin liên hệ), mỗi danh sách phải bao gồm tên, tuổi và số điện thoại. Tất nhiên, từ quan điểm logic, dữ liệu về độ tuổi không nhất thiết phải đứng trước số điện thoại. Do đó, các thuộc tính đều không có thứ tự và do đó là sự lựa chọn trực quan hơn. So sánh hai tài liệu XML nhỏ được hiển thị trong Liệt kê 1 và 2:

Liệt kê 1. Sử dụng các thuộc tính để truyền thông tin liên hệ Liệt kê 2. Sử dụng các phần tử lồng nhau để truyền tải thông tin liên hệ Jane Doe 74 555-3412 Chiêu Win 555-8888 44

Bây giờ hãy tưởng tượng DTD có thể được chỉ định cho từng định dạng XML này. Đối với Liệt kê 1, thể hiện việc sử dụng các thuộc tính, đây có thể là DTD sau:

Liệt kê 3. Tài liệu DTD sử dụng các thuộc tính

DTD cho tài liệu minh họa việc sử dụng các phần tử lồng nhau có thể trông như thế này:

Liệt kê 4. Tài liệu DTD sử dụng các phần tử lồng nhau

Hạn chế rõ ràng của DTD được hiển thị trong Liệt kê 4 là ví dụ đơn giản này (Liệt kê 2) không hợp lệ theo DTD đó. Vấn đề là thứ tự của các phần tử lồng nhau không đúng thứ tự. Bảng này cho thấy cách bạn có thể sử dụng các phần tử lồng nhau không có thứ tự với DTD, mặc dù trừ khi có những lý do thuyết phục khác, cách tốt nhất của bạn là sử dụng cài đặt thuộc tính để truyền tải dữ liệu không có thứ tự.

Khả năng tìm thấy nhiều dữ liệu trên một cấp độ

Nếu cùng một dữ liệu được lặp lại nhiều lần trong một đối tượng thì các phần tử lồng nhau rõ ràng sẽ được ưu tiên hơn. Ví dụ, trong ví dụ trên, đối tượng contact chứa nhiều đối tượng contact. Rõ ràng là trong trường hợp này, mỗi liên hệ phải được mô tả trong phần tử con của phần tử liên hệ.

Tuy nhiên, trong đời thực, khi thực hiện thay đổi, các nhà phát triển thường xa rời nguyên tắc thiết kế này. Hãy xem điều này có thể xảy ra như thế nào: Đầu tiên, bạn xác định rằng mỗi Flazbar có một flizbam được đính kèm (và flizbam được mô tả bằng một giá trị duy nhất). Có vẻ hợp lý khi lưu phần đệm bổ sung của các phần tử lồng nhau và tạo thuộc tính flizbam cho thẻ Flazbar. Tuy nhiên, sau đó - sau khi bạn đã viết mã hoạt động tốt để xử lý nhiều Flazbar - bạn biết rằng trong một số trường hợp, một Flazbar có thể có hai flizbam. Nhưng đây không phải là vấn đề: bạn thực hiện những thay đổi nhỏ đối với mã đã cài đặt và chỉ cần viết lại DTD:

Sau khi sửa mã, tài liệu XML cũ của bạn vẫn hợp lệ và tài liệu XML mới vẫn hoạt động. Một lúc sau, bạn phát hiện ra rằng Flazbar có thể có flizbam thứ ba...

Thật khó để không bị quyến rũ bởi nguyên tắc thiết kế quỷ quyệt này. Tuy nhiên, dữ liệu và đối tượng ngày càng phát triển và các đối tượng đơn lẻ thường trở thành gấp đôi hoặc nhiều. Một số lập trình viên XML né tránh các thuộc tính vì lý do này, nhưng tôi nghĩ điều này đã đi quá xa. Lời khuyên của tôi là hãy cân nhắc cẩn thận ở giai đoạn thiết kế xem liệu một đơn vị số lượng sau này có các phần tử ở cùng cấp độ hay không. Nếu có mọi lý do để tin rằng sẽ có nhiều phần tử cùng cấp trong tương lai, hãy sử dụng các phần tử lồng nhau ngay từ đầu. Nếu bạn tin tưởng rằng đối tượng dữ liệu sẽ vẫn là duy nhất, hãy bám vào các thuộc tính.

Mô hình hóa các phần tử lồng nhau không có thứ tự

Để tài liệu XML trong Liệt kê 2 hợp lệ, định nghĩa sau đây phải được thêm vào DTD:

DTD xác định rất linh hoạt các phần tử lồng nhau chứa thông tin liên hệ Tuy nhiên, DTD trên cung cấp quá nhiều sự linh hoạt. Trong trường hợp này, phần tử liên hệ có thể thiếu phần tử tên và cũng có nhiều phần tử tuổi, vi phạm các yêu cầu về ngữ nghĩa. Để giải quyết vấn đề hiện tại, cần phải có một định nghĩa cực kỳ phức tạp được đưa ra dưới đây:

DTD cồng kềnh nhưng chính xác cho các phần tử mang thông tin liên hệ DTD này rất xấu và khi các phần tử con mới được thêm vào, kích thước của nó sẽ tăng theo cấp số nhân. Hơn nữa, DTD chặt chẽ hơn mức cần thiết về mặt ngữ nghĩa, điều này cũng không mong muốn đối với tác giả dữ liệu (ví dụ: chỉ định DTD cho phần tử lồng nhau đầu tiên).

Bắt buộc phải bảo toàn không gian trống

Sau khi thực hiện chuẩn hóa thuộc tính, bạn có thể mong đợi rằng mỗi thuộc tính sẽ được phân tách với các thuộc tính lân cận bằng một khoảng trắng. Nhưng đó là tất cả những gì bạn có thể tin cậy. Để dễ đọc, bạn có thể thêm khoảng trắng theo chiều dọc hoặc chiều ngang một cách an toàn vào các giá trị thuộc tính dài (trên thực tế, bạn nên làm như vậy). Nhưng nếu những thuộc tính mà con người có thể đọc được này đi qua một trình phân tích cú pháp XML thì bố cục của các thuộc tính có thể sẽ hơi khác so với những gì được tìm thấy ban đầu trong XML nguồn.

Nếu không gian trống có tầm quan trọng đặc biệt thì việc sử dụng các phần tử lồng nhau là lựa chọn tốt nhất. Ví dụ: nếu bạn đang trình bày thứ gì đó như mã nguồn hoặc thơ mà bạn cần duy trì nghiêm ngặt khoảng cách ký tự, hãy gắn với các thuộc tính.

Tầm quan trọng của khả năng đọc

Lý tưởng nhất là XML phải là định dạng mà máy tính có thể đọc được chứ không phải định dạng mà con người có thể đọc được. Tuy nhiên, dù tốt hay xấu thì lập trình viên cũng là con người và trong tương lai gần, họ sẽ dành nhiều thời gian để đọc, viết và gỡ lỗi các tệp XML. Tất nhiên, việc đọc một tệp XML chỉ được định dạng từ góc nhìn của máy tính là một quá trình khó khăn (không có dung lượng trống hoặc không gian trống không xác định).

Cá nhân tôi thấy việc đọc và viết các định dạng XML hướng thuộc tính dễ dàng hơn nhiều so với các định dạng hướng phần tử lồng nhau. Để làm cho điều này rõ ràng hơn, chúng ta hãy quay lại Danh sách 1 và 2. Cả hai đều không khó đọc, nhưng Danh sách 2, thể hiện cách tiếp cận dựa trên thuộc tính, đơn giản hơn và cũng dễ viết hơn vì bạn không cần phải xử lý với vấn đề các phần tử sắp xếp lồng nhau không nhất quán.

Phần kết luận

Bài viết này chỉ ra khi nào nên sử dụng các phần tử lồng nhau và khi nào nên sử dụng các thuộc tính. Việc tính đến những nguyên tắc này có thể giúp bạn tạo các định dạng tài liệu XML rõ ràng hơn, rõ ràng hơn. Thật không may, đôi khi tình hình thực tế lại phụ thuộc vào nhiều hoàn cảnh (chỉ về những hướng ngược nhau). Thường thì cấu trúc dữ liệu thay đổi nhiều đến mức làm mất hiệu lực các động lực trước đó. Hãy sử dụng các đề xuất được nêu trong bài viết này bất cứ khi nào có thể, nhưng trên hết, hãy sử dụng ý thức chung (dựa trên thông tin có sẵn).

Tài nguyên

  • Tất cả những gì bạn thực sự cần biết về XML là Ngôn ngữ đánh dấu mở rộng khuyến nghị của W3C (XML) 1.0. Tất nhiên, cần có một chút hiểu biết sâu sắc để hiểu tại sao nó lại quan trọng.
  • Phần Trang bìa XML cung cấp hướng dẫn về "Sử dụng các phần tử và thuộc tính". Trang này cũng chứa các liên kết đến một số bài viết đưa ra các lập luận trái ngược nhau về việc nên chọn thuộc tính hoặc thành phần nào. Chính vì lý do này mà các lập trình viên chúng tôi “có được đồng đô la dài hạn”!
  • Một cách khác để hiểu sự khác biệt giữa các thuộc tính và thành phần là nghiên cứu Định dạng dựa trên tài liệu hoặc Định dạng theo hướng dữ liệu ("").
  • Hãy xem các cột thủ thuật XML khác trong phần XML của devWorks.

Giới thiệu về tác giả

David Mertz sử dụng trí thông minh hoàn toàn phi cấu trúc để viết về các định dạng tài liệu có cấu trúc. David có thể liên lạc được tại: [email được bảo vệ], và cuộc đời của anh ấy được mô tả tại http://gnosis.cx/publish/.


Rõ ràng, đây là một lỗi đánh máy (trong bản gốc có Danh sách 2): và thay vì Danh sách 2 thì nên có Danh sách 1 (xấp xỉ)