Các phần tử XML so với các thuộc tính
Trong XML, không có quy tắc nào về thời điểm sử dụng thuộc tính và thời điểm sử dụng các phần tử con.
Sử dụng các phần tử so với thuộc tính
Dữ liệu có thể được lưu trữ trong các phần tử con hoặc trong thuộc tính.
Hãy xem những ví dụ sau:
<person sex="female">
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
<person>
<sex>female</sex>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
Trong ví dụ đầu tiên, giới tính là một thuộc tính. Cuối cùng, tình dục là một yếu tố trẻ con. 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 nên sử dụng các phần tử con. Kinh nghiệm của tôi là các thuộc tính rất hữu ích trong HTML, nhưng trong XML bạn nên cố gắng tránh chúng. Sử dụng các phần tử con nếu thông tin giống như dữ liệu.
Con đường yêu thích của tôi
Tôi thích lưu trữ dữ liệu trong các phần tử con.
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:
<note date="12/11/2002">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
Phần tử ngày được sử dụng trong ví dụ thứ hai:
<note>
<date>12/11/2002</date>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
Phần tử ngày mở rộng được sử dụng trong phần thứ ba: (ĐÂY LÀ YÊU THÍCH CỦA TÔI):
<note>
<date>
<day>12</day>
<month>11</month>
<year>2002</year>
</date>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
Tránh sử dụng thuộc tính?
Bạn có nên tránh sử dụng thuộc tính?
Một số vấn đề với thuộc tính là:
- thuộc tính không thể chứa nhiều giá trị (phần tử con 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)
- thuộc tính không thể mô tả cấu trúc (phần tử con có thể)
- các thuộc tính khó thao tác hơn bằng mã chương trình
- giá trị thuộc tính không dễ kiểm tra đối với DTD
Nếu bạn sử dụng các thuộc tính làm nơi chứa dữ liệu, bạn sẽ nhận được những tài liệu khó đọc và khó bảo trì. Cố gắng sử dụng các phần tử để mô tả dữ liệu. Chỉ sử dụng các thuộc tính để cung cấp thông tin không liên quan đến dữ liệu.
Đừng kết thúc như thế này (đây không phải là cách sử dụng XML):
<note day="12" month="11" year="2002"
to="Tove" from="Jani" heading="Reminder"
body="Don't forget me this weekend!">
</note>
Ngoại lệ đối với Quy tắc thuộc tính của tôi
Quy tắc luôn có ngoại lệ.
Quy tắc của tôi về thuộc tính có một ngoại lệ:
Đôi khi tôi chỉ định tham chiếu ID cho các phần tử. Các tham chiếu ID này có thể được sử dụng để truy cập các phần tử XML theo cách tương tự như các thuộc tính NAME hoặc ID trong HTML. Ví dụ này chứng minh điều này:
<messages>
<note id="p501">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
<note id="p502">
<to>Jani</to>
<from>Tove</from>
<heading>Re: Reminder</heading>
<body>I will not!</body>
</note>
</messages>
ID trong các ví dụ này chỉ là bộ đếm hoặc mã định danh duy nhất để xác định các ghi chú khác nhau trong tệp XML chứ không phải là một phần của dữ liệu 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ử.