Thuộc tính XML so với phần tử XML


253

Khi làm việc, chúng tôi được yêu cầu tạo các tệp XML để truyền dữ liệu sang một ứng dụng ngoại tuyến khác, sau đó sẽ tạo một tệp XML thứ hai để gửi lại để cập nhật một số dữ liệu của chúng tôi. Trong quá trình chúng tôi đã thảo luận với nhóm của ứng dụng khác về cấu trúc của tệp XML.

Mẫu mà tôi đã đưa ra về cơ bản là một cái gì đó như:

<INVENTORY>
   <ITEM serialNumber="something" location="something" barcode="something">
      <TYPE modelNumber="something" vendor="something"/> 
   </ITEM>
</INVENTORY>

Nhóm khác nói rằng đây không phải là tiêu chuẩn công nghiệp và các thuộc tính chỉ nên được sử dụng cho dữ liệu meta. Họ đề nghị:

<INVENTORY>
   <ITEM>
      <SERIALNUMBER>something</SERIALNUMBER>
      <LOCATION>something</LOCATION>
      <BARCODE>something</BARCODE>
      <TYPE>
         <MODELNUMBER>something</MODELNUMBER>
         <VENDOR>something</VENDOR>
      </TYPE>
   </ITEM>
</INVENTORY>

Lý do tôi đề xuất đầu tiên là kích thước của tệp được tạo nhỏ hơn nhiều. Sẽ có khoảng 80000 mặt hàng sẽ có trong tập tin trong quá trình chuyển. Gợi ý của họ trong thực tế hóa ra lớn gấp ba lần so với đề xuất của tôi. Tôi đã tìm kiếm "Tiêu chuẩn công nghiệp" bí ẩn đã được đề cập, nhưng gần nhất tôi có thể tìm thấy là các thuộc tính XML chỉ nên được sử dụng cho dữ liệu meta, nhưng cho biết cuộc tranh luận là về dữ liệu meta thực sự là gì.

Sau phần giải thích dài dòng (xin lỗi), làm thế nào để bạn xác định dữ liệu meta là gì và khi thiết kế cấu trúc của tài liệu XML, bạn nên quyết định khi nào nên sử dụng một thuộc tính hoặc một phần tử?


4
Tôi tìm thấy tài nguyên thực sự tốt này: ibm.com/developerworks/xml/l Library / x
Laurens Holst

5
+1 cho "... cuộc tranh luận là về những gì thực sự là dữ liệu meta."
Giữ lại

Vui lòng lưu ý tên thẻ chữ thường có dấu gạch nối: stackoverflow.com/questions/1074447/ trên
Ben

Câu trả lời:


145

Tôi sử dụng quy tắc này:

  1. Thuộc tính là một cái gì đó khép kín, nghĩa là màu sắc, ID, tên.
  2. Một phần tử là một cái gì đó có hoặc có thể có các thuộc tính của riêng nó hoặc chứa các phần tử khác.

Vì vậy, của bạn là gần. Tôi đã làm một cái gì đó như:

EDIT : Cập nhật ví dụ ban đầu dựa trên phản hồi bên dưới.

  <ITEM serialNumber="something">
      <BARCODE encoding="Code39">something</BARCODE>
      <LOCATION>XYX</LOCATION>
      <TYPE modelNumber="something">
         <VENDOR>YYZ</VENDOR>
      </TYPE>
   </ITEM>

22
Tôi đã đọc qua một số câu trả lời và một điều chưa được nhấn mạnh đủ theo kinh nghiệm của tôi là nếu dữ liệu của bạn trong một "thuộc tính" và đột nhiên có một tài liệu> hoặc <you XML sẽ bị phá vỡ, tôi nghĩ rằng có năm ký tự ascii (>, <, &,?, ") sẽ giết chết nó. Nếu ký tự đặc biệt này có trong Phần tử, bạn chỉ cần thêm một số thẻ CDATA xung quanh dữ liệu này. Tôi sẽ nói, chỉ sử dụng các thuộc tính khi bạn biết 100% giá trị nào sẽ được đặt trong đó, ví dụ: số nguyên hoặc ngày tháng, có thể là bất cứ thứ gì do máy tính tạo ra. Nếu Mã vạch được tạo bởi con người thì đó không phải là một thuộc tính.
John Ballinger

39
Thực sự đến bữa tiệc muộn, nhưng đối số char ASCII đặc biệt là sai - đó là những gì thoát ra được, cho cả thuộc tính và dữ liệu văn bản.
micahtan

2
@donroby - Xin lỗi, đó sẽ là sai lầm của tôi khi giao tiếp. Bằng cách thoát, tôi có nghĩa là mã hóa XML. '<' = & lt; v.v ... Có vẻ kỳ lạ đối với tôi khi quyết định giữa một thuộc tính hoặc thành phần dựa trên các ký tự tạo nên nội dung thay vì ý nghĩa của nội dung.
micahtan

3
@donroby: không đúng. Văn bản thay thế &lt;&#60;, là một tham chiếu ký tự, không phải là một tham chiếu thực thể. &lt;là OK trong các thuộc tính. Xem: w3.org/TR/REC-xml/#sec-pred xác định
ent

14
@ John: nếu đây là một vấn đề thì có gì đó trong chuỗi công cụ của bạn không tạo ra XML hợp lệ. Tôi không nghĩ rằng đây là một lý do để lựa chọn giữa các thuộc tính hoặc các yếu tố. (Hơn nữa, bạn không thể "chỉ thêm các thẻ CDATA" xung quanh đầu vào của người dùng vì nó có thể chứa ]]>!)
porges

48

Một số vấn đề với các 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 (cho các thay đổi trong tương lai)
  • thuộc tính không thể mô tả cấu trúc (yếu 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 vùng chứa dữ liệu, bạn sẽ có tài liệu khó đọc và bảo trì. Cố gắng sử dụng các yếu 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" to2="John" from="Jani" heading="Reminder"  
      body="Don't forget me this weekend!"> 
</note>

Nguồn: http://www.w3schools.com/xml/xml_dtd_el_vs_attr.asp


2
Điểm đầu tiên không chính xác, xem: w3.org/TR/xmlschema-2/#derivation-by-list
porges

6
Tôi muốn nói rằng điểm đầu tiên là chính xác và listlà một cách giải quyết một phần cho vấn đề này. Không thể có nhiều thuộc tính có cùng tên. Với listthuộc tính vẫn chỉ có một giá trị, đó là danh sách một số kiểu dữ liệu được phân tách bằng khoảng trắng. Các ký tự phân tách được cố định để bạn không thể có nhiều giá trị nếu một giá trị của kiểu dữ liệu mong muốn có thể chứa khoảng trắng. Điều này loại trừ các cơ hội để có ví dụ nhiều địa chỉ trong một thuộc tính "địa chỉ".
jasso

7
'Các thuộc tính khó thao tác hơn bằng mã chương trình' - Không thể đồng ý với thuộc tính đó. Trong thực tế, tôi đã tìm thấy điều ngược lại là đúng. Nó không đủ khác biệt để thực sự nêu cả hai cách.
Paul Alexander

4
Tôi cũng nói thêm rằng việc xác thực đối với một DTD không còn thực sự phù hợp nữa, với XML-Schema, Schematron và Relax, et. al. tất cả đều cung cấp mạnh mẽ hơn nhiều và trong một số trường hợp, các cách trực quan hơn để xác thực các tài liệu XML. Ngoài ra, W3Schools là một tài liệu tham khảo thực sự kém cho mọi thứ

37

"XML" là viết tắt của " Ngôn ngữ đánh dấu có thể mở rộng ". Một ngôn ngữ đánh dấu ngụ ý rằng dữ liệu là văn bản, được đánh dấu bằng siêu dữ liệu về cấu trúc hoặc định dạng.

XHTML là một ví dụ về XML được sử dụng theo cách nó được dự định:

<p><span lang="es">El Jefe</span> insists that you
    <em class="urgent">MUST</em> complete your project by Friday.</p>

Ở đây, sự phân biệt giữa các yếu tố và thuộc tính là rõ ràng. Các thành phần văn bản được hiển thị trong trình duyệt và các thuộc tính là hướng dẫn về cách hiển thị chúng (mặc dù có một số thẻ không hoạt động theo cách đó).

Nhầm lẫn phát sinh khi XML được sử dụng không phải là ngôn ngữ đánh dấu, mà là ngôn ngữ tuần tự hóa dữ liệu , trong đó sự phân biệt giữa "dữ liệu" và "siêu dữ liệu" là mơ hồ hơn. Vì vậy, sự lựa chọn giữa các yếu tố và thuộc tính ít nhiều tùy ý ngoại trừ những thứ không thể được biểu diễn bằng các thuộc tính (xem câu trả lời của feenster).


32

Phần tử XML so với thuộc tính XML

XML là tất cả về thỏa thuận. Đầu tiên trì hoãn mọi lược đồ XML hiện có hoặc các quy ước được thiết lập trong cộng đồng hoặc ngành của bạn.

Nếu bạn thực sự ở trong một tình huống để xác định lược đồ của bạn từ đầu, đây là một số cân nhắc chung cần thông báo cho phần tử và quyết định thuộc tính :

<versus>
  <element attribute="Meta content">
    Content
  </element>
  <element attribute="Flat">
    <parent>
      <child>Hierarchical</child>
    </parent>
  </element>
  <element attribute="Unordered">
    <ol>
      <li>Has</li>
      <li>order</li>
    </ol>
  </element>
  <element attribute="Must copy to reuse">
    Can reference to re-use
  </element>
  <element attribute="For software">
    For humans
  </element>
  <element attribute="Extreme use leads to micro-parsing">
    Extreme use leads to document bloat
  </element>
  <element attribute="Unique names">
    Unique or non-unique names
  </element>
  <element attribute="SAX parse: read first">
    SAX parse: read later
  </element>
  <element attribute="DTD: default value">
    DTD: no default value
  </element>
</versus>

23

Nó có thể phụ thuộc vào cách sử dụng của bạn. XML được sử dụng để biểu diễn dữ liệu được sắp xếp được tạo từ cơ sở dữ liệu có thể hoạt động tốt với các giá trị trường cuối cùng được đặt làm thuộc tính.

Tuy nhiên, XML được sử dụng làm truyền tải thông điệp thường sẽ tốt hơn khi sử dụng nhiều phần tử hơn.

Ví dụ: giả sử chúng tôi có XML này như được đề xuất trong câu trả lời: -

<INVENTORY>
   <ITEM serialNumber="something" barcode="something">
      <Location>XYX</LOCATION>
      <TYPE modelNumber="something">
         <VENDOR>YYZ</VENDOR>
      </TYPE>
    </ITEM>
</INVENTORY>

Bây giờ chúng tôi muốn gửi phần tử ITEM đến một thiết bị để in mã vạch, tuy nhiên có một sự lựa chọn về các loại mã hóa. Làm thế nào để chúng tôi đại diện cho loại mã hóa cần thiết? Đột nhiên, chúng tôi nhận ra, hơi muộn màng, rằng mã vạch không phải là một giá trị tự động duy nhất mà là nó có thể đủ tiêu chuẩn với mã hóa cần thiết khi được in.

   <ITEM serialNumber="something">
      <barcode encoding="Code39">something</barcode>
      <Location>XYX</LOCATION>
      <TYPE modelNumber="something">
         <VENDOR>YYZ</VENDOR>
      </TYPE>
   </ITEM>

Vấn đề là trừ khi bạn xây dựng một số loại XSD hoặc DTD cùng với một không gian tên để sửa cấu trúc trong đá, bạn có thể được phục vụ tốt nhất để mở các tùy chọn của mình.

IMO XML là hữu ích nhất khi nó có thể được uốn mà không phá vỡ mã hiện có bằng cách sử dụng nó.


Điểm hay của "mã vạch", tôi đã đưa ra ví dụ của mình và chắc chắn đã phá vỡ điều đó thành yếu tố của chính nó. Cũng là điểm tốt trên XSD / DTD.
Chuck

10

Tôi sử dụng các hướng dẫn sau trong thiết kế lược đồ của mình liên quan đến các thuộc tính so với các phần tử:

  • Sử dụng các phần tử cho văn bản chạy dài (thường là các kiểu thuộc loại chuỗi hoặc normalizedString)
  • Không sử dụng một thuộc tính nếu có nhóm hai giá trị (ví dụ: eventStartDate và eventEndDate) cho một phần tử. Trong ví dụ trước, cần có một phần tử mới cho "sự kiện" có thể chứa các thuộc tính startDate và endDate.
  • Ngày kinh doanh, DateTime và số (ví dụ: số lượng, số lượng và tỷ lệ) phải là các yếu tố.
  • Các yếu tố thời gian không kinh doanh như cập nhật lần cuối, hết hạn phải là thuộc tính.
  • Các số không phải là doanh nghiệp như mã băm và chỉ mục phải là thuộc tính. * Sử dụng các phần tử nếu loại sẽ phức tạp.
  • Sử dụng các thuộc tính nếu giá trị là một loại đơn giản và không lặp lại.
  • xml: id và xml: lang phải là các thuộc tính tham chiếu lược đồ XML
  • Thích các thuộc tính khi có thể về mặt kỹ thuật.

Các ưu tiên cho các thuộc tính là nó cung cấp như sau:

  • duy nhất (thuộc tính không thể xuất hiện nhiều lần)
  • thứ tự không quan trọng
  • các thuộc tính trên có thể kế thừa (đây là điều mà mô hình nội dung "tất cả" không hỗ trợ trong ngôn ngữ lược đồ hiện tại)
  • Phần thưởng là chúng ít dài dòng hơn và sử dụng ít băng thông hơn, nhưng đó không thực sự là lý do để thích các thuộc tính hơn các yếu tố.

Tôi đã thêm vào khi có thể về mặt kỹ thuật bởi vì có những lúc không thể sử dụng các thuộc tính. Ví dụ, lựa chọn tập thuộc tính. Ví dụ: không thể sử dụng xor (startDate và endDate) (startTS và endTS) với ngôn ngữ lược đồ hiện tại

Nếu Lược đồ XML bắt đầu cho phép mô hình nội dung "tất cả" bị hạn chế hoặc mở rộng thì có lẽ tôi sẽ bỏ nó


8

Khi nghi ngờ, KISS - tại sao trộn các thuộc tính và thành phần khi bạn không có lý do rõ ràng để sử dụng thuộc tính. Nếu sau này bạn quyết định xác định XSD, điều đó cũng sẽ sạch hơn. Sau đó, nếu bạn thậm chí sau đó quyết định tạo cấu trúc lớp từ XSD của mình, điều đó cũng sẽ đơn giản hơn.


8

Không có câu trả lời chung cho câu hỏi này (tôi đã tham gia rất nhiều vào việc tạo ra thông số W3C). XML có thể được sử dụng cho nhiều mục đích - tài liệu giống như văn bản, dữ liệu và mã khai báo là ba trong số phổ biến nhất. Tôi cũng sử dụng nó rất nhiều như một mô hình dữ liệu. Có những khía cạnh của các ứng dụng này, nơi các thuộc tính phổ biến hơn và các khía cạnh khác trong đó các phần tử con tự nhiên hơn. Ngoài ra còn có các tính năng của các công cụ khác nhau giúp sử dụng chúng dễ dàng hơn hoặc khó hơn.

XHTML là một khu vực nơi các thuộc tính có cách sử dụng tự nhiên (ví dụ: trong lớp = 'foo'). Các thuộc tính không có thứ tự và điều này có thể giúp một số người dễ dàng phát triển các công cụ hơn. Các thuộc tính OTOH khó nhập hơn nếu không có lược đồ. Tôi cũng thấy các thuộc tính được đặt tên (foo: bar = "zork") thường khó quản lý hơn trong các bộ công cụ khác nhau. Nhưng hãy xem một số ngôn ngữ W3C để thấy hỗn hợp phổ biến. SVG, XSLT, XSD, MathML là một số ví dụ về các ngôn ngữ nổi tiếng và tất cả đều có nguồn cung cấp các thuộc tính và thành phần phong phú. Một số ngôn ngữ thậm chí cho phép nhiều hơn một cách để làm điều đó, ví dụ:

<foo title="bar"/>;

hoặc là

<foo>
  <title>bar</title>;
</foo>;

Lưu ý rằng những cái này KHÔNG tương đương về mặt cú pháp và yêu cầu hỗ trợ rõ ràng trong các công cụ xử lý)

Lời khuyên của tôi là hãy nhìn vào thực tiễn phổ biến trong khu vực gần ứng dụng của bạn nhất và cũng xem xét những bộ công cụ nào bạn có thể muốn áp dụng.

Cuối cùng hãy chắc chắn rằng bạn phân biệt các không gian tên với các thuộc tính. Một số hệ thống XML (ví dụ Linq) biểu thị các không gian tên làm thuộc tính trong API. IMO này là xấu xí và có khả năng gây nhầm lẫn.


6

Những người khác đã đề cập đến cách phân biệt giữa các thuộc tính với các thành phần nhưng từ góc độ tổng quát hơn đặt mọi thứ vào thuộc tính vì nó làm cho kết quả XML nhỏ hơn là sai.

XML không được thiết kế nhỏ gọn mà có thể mang theo và có thể đọc được. Nếu bạn muốn giảm kích thước của dữ liệu trong quá trình thì hãy sử dụng một cái gì đó khác (chẳng hạn như bộ đệm giao thức của google ).


Văn bản XML nhỏ hơn dễ đọc hơn chỉ vì nó nhỏ hơn!
Nashev

5

Câu hỏi triệu đô!

Trước hết, đừng lo lắng quá nhiều về hiệu suất bây giờ. bạn sẽ ngạc nhiên khi thấy trình phân tích cú pháp xml được tối ưu hóa sẽ nhanh chóng chuyển qua xml của bạn. quan trọng hơn, thiết kế của bạn trong tương lai là gì: khi XML phát triển, bạn sẽ duy trì khả năng khớp nối và khả năng tương tác lỏng lẻo như thế nào?

cụ thể hơn, bạn có thể làm cho mô hình nội dung của một yếu tố phức tạp hơn nhưng việc mở rộng một thuộc tính khó hơn.


5

Cả hai phương thức để lưu trữ các thuộc tính của đối tượng là hoàn toàn hợp lệ. Bạn nên khởi hành từ những cân nhắc thực dụng. Hãy thử trả lời câu hỏi sau:

  1. Đại diện nào dẫn đến phân tích dữ liệu nhanh hơn \ thế hệ?

  2. Đại diện nào dẫn đến truyền dữ liệu nhanh hơn?

  3. Có dễ đọc không?

    ...


5

Sử dụng các yếu tố cho dữ liệu và thuộc tính cho dữ liệu meta (dữ liệu về dữ liệu của thành phần).

Nếu một phần tử hiển thị dưới dạng một vị ngữ trong chuỗi chọn của bạn, bạn có một dấu hiệu tốt cho thấy đó phải là một thuộc tính. Tương tự như vậy nếu một thuộc tính không bao giờ được sử dụng làm vị ngữ, thì có thể đó không phải là dữ liệu meta hữu ích.

Hãy nhớ rằng XML được coi là máy có thể đọc được chứ không phải con người có thể đọc được và đối với các tài liệu lớn, XML nén rất tốt.


4

Dù có thể tranh cãi theo cách nào, nhưng các đồng nghiệp của bạn đã hiểu đúng rằng XML nên được sử dụng cho "đánh dấu" hoặc siêu dữ liệu xung quanh dữ liệu thực tế. Về phần bạn, bạn nói đúng rằng đôi khi rất khó để quyết định ranh giới giữa dữ liệu meta và dữ liệu là gì khi mô hình hóa miền của bạn trong XML. Trong thực tế, những gì tôi làm là giả vờ rằng bất cứ điều gì trong đánh dấu đều bị ẩn và chỉ có dữ liệu bên ngoài đánh dấu là có thể đọc được. Liệu tài liệu có ý nghĩa theo cách đó?

XML nổi tiếng là cồng kềnh. Đối với vận chuyển và lưu trữ, nén rất được khuyến khích nếu bạn có đủ khả năng xử lý. XML nén tốt, đôi khi rất tốt, vì tính lặp lại của nó. Tôi đã có các tệp lớn nén xuống dưới 5% kích thước ban đầu của chúng.

Một điểm khác để củng cố vị trí của bạn là trong khi nhóm khác đang tranh luận về phong cách (trong đó hầu hết các công cụ XML sẽ xử lý một tài liệu thuộc tính tất cả dễ dàng như một tài liệu PCDATA), bạn đang tranh luận về tính thực tiễn. Mặc dù phong cách không thể hoàn toàn bị bỏ qua, nhưng giá trị kỹ thuật sẽ mang nhiều trọng lượng hơn.


4

Đó chủ yếu là vấn đề ưu tiên. Tôi sử dụng các yếu tố để nhóm và các thuộc tính cho dữ liệu khi có thể vì tôi thấy nó nhỏ gọn hơn so với giải pháp thay thế.

Ví dụ tôi thích .....

<?xml version="1.0" encoding="utf-8"?>
<data>
    <people>
         <person name="Rory" surname="Becker" age="30" />
        <person name="Travis" surname="Illig" age="32" />
        <person name="Scott" surname="Hanselman" age="34" />
    </people>
</data>

...Thay vì....

<?xml version="1.0" encoding="utf-8"?>
<data>
    <people>
        <person>
            <name>Rory</name>
            <surname>Becker</surname>
            <age>30</age>
        </person>
        <person>
            <name>Travis</name>
            <surname>Illig</surname>
            <age>32</age>
        </person>
        <person>
            <name>Scott</name>
            <surname>Hanselman</surname>
            <age>34</age>
        </person>
    </people>
</data>

Tuy nhiên, nếu tôi có dữ liệu không thể hiện dễ dàng bên trong khoảng 20-30 ký tự hoặc chứa nhiều trích dẫn hoặc các ký tự khác cần thoát thì tôi đã nói rằng đã đến lúc phá vỡ các yếu tố ... có thể bằng các khối CData.

<?xml version="1.0" encoding="utf-8"?>
<data>
    <people>
        <person name="Rory" surname="Becker" age="30" >
            <comment>A programmer whose interested in all sorts of misc stuff. His Blog can be found at http://rorybecker.blogspot.com and he's on twitter as @RoryBecker</comment>
        </person>
        <person name="Travis" surname="Illig" age="32" >
            <comment>A cool guy for who has helped me out with all sorts of SVn information</comment>
        </person>
        <person name="Scott" surname="Hanselman" age="34" >
            <comment>Scott works for MS and has a great podcast available at http://www.hanselminutes.com </comment>
        </person>
    </people>
</data>

2
Điều này hoàn toàn sai Tôi sợ - bạn nên làm theo hướng dẫn của W3C: w3schools.com/DTD/dtd_el_vs_attr.asp - XML ​​không nên được hình thành trên khả năng đọc hoặc làm cho nó "nhỏ gọn" - mà nên sử dụng chính xác các yếu tố hoặc thuộc tính mà họ đã được thiết kế cho.
Vidar

24
Tôi xin lỗi, nhưng điều này là sai lệch. Trang W3schools không phải là hướng dẫn của W3C. Đề xuất XML của W3C (trong đó tôi là người tham gia) cho phép các yếu tố và thuộc tính được sử dụng theo nhu cầu và phong cách của người dùng.
peter.m bồ.rust

4

Làm thế nào về việc tận dụng trực giác định hướng đối tượng khó kiếm của chúng tôi? Tôi thường thấy nó là thẳng về phía trước để nghĩ đó là một đối tượng và đó là một thuộc tính của đối tượng hoặc đối tượng mà nó đang đề cập đến.

Bất cứ điều gì trực giác có ý nghĩa như các đối tượng sẽ phù hợp như là các yếu tố. Các thuộc tính (hoặc thuộc tính) của nó sẽ là các thuộc tính cho các phần tử này trong xml hoặc phần tử con có thuộc tính.

Tôi nghĩ đối với các trường hợp đơn giản hơn như trong ví dụ tương tự hướng đối tượng hoạt động ổn để tìm ra phần tử nào và thuộc tính nào của phần tử.


2

Chỉ cần một vài sửa chữa cho một số thông tin xấu:

@ John Ballinger: Các thuộc tính có thể chứa bất kỳ dữ liệu ký tự nào. <> & "'cần phải được thoát đến & lt; & gt; & amp; & quot; và & apos;, nếu bạn sử dụng thư viện XML, nó sẽ giải quyết vấn đề đó cho bạn.

Địa ngục, một thuộc tính có thể chứa dữ liệu nhị phân như hình ảnh, nếu bạn thực sự muốn, chỉ bằng cách mã hóa cơ sở64 và biến nó thành dữ liệu: URL.

@feenster: Các thuộc tính có thể chứa nhiều mục được phân tách bằng dấu cách trong trường hợp IDS hoặc Nnam, bao gồm các số. Nitpicky, nhưng điều này có thể tiết kiệm không gian.

Sử dụng các thuộc tính có thể giữ XML cạnh tranh với JSON. Xem Fat Markup: Cắt giảm huyền thoại Fat Fatup một calo mỗi lần .


Không chỉ id hoặc tên. Chúng có thể chứa các danh sách được phân tách bằng dấu cách của bất cứ thứ gì.
John Saunders

@JohnSaunders IDS hoặc NAMES là các loại DTD cụ thể (tôi cũng nghĩ là Lược đồ XML), được hỗ trợ ở mức độ thấp bởi hầu hết các bộ xử lý XML. Nếu được xử lý bởi lớp ứng dụng thay vì các thư viện XML, bất kỳ loại dữ liệu ký tự nào cũng hoạt động (các giá trị riêng biệt hoặc bất cứ thứ gì).
brianary

Cá nhân, chỉ vì bạn không thể có nghĩa là bạn nên.
Lankymart

1
@Lankymart Như tôi đã nói, tôi chỉ sửa một số thông tin không chính xác (đó là điểm cao vì một số lý do). Dữ liệu nhị phân thường không thuộc về XML.
brianary

1

Tôi luôn ngạc nhiên về kết quả của những cuộc thảo luận này. Đối với tôi có một quy tắc rất đơn giản để quyết định liệu dữ liệu thuộc về một thuộc tính hay là nội dung và đó là liệu dữ liệu có cấu trúc phụ có thể điều hướng được hay không.

Vì vậy, ví dụ, văn bản không đánh dấu luôn thuộc về các thuộc tính. Luôn luôn.

Danh sách thuộc cấu trúc phụ hoặc nội dung. Văn bản có thể theo thời gian bao gồm nội dung phụ có cấu trúc nhúng thuộc về nội dung. (Theo kinh nghiệm của tôi, có khá ít điều này - văn bản có đánh dấu - khi sử dụng XML để lưu trữ hoặc trao đổi dữ liệu.)

Lược đồ XML được viết theo cách này là súc tích.

Bất cứ khi nào tôi thấy các trường hợp như thế <car><make>Ford</make><color>Red</color></car>, tôi nghĩ rằng "tác giả đã nghĩ rằng sẽ có các yếu tố phụ trong yếu tố tạo nên?" <car make="Ford" color="Red" />dễ đọc hơn đáng kể, không có câu hỏi nào về cách xử lý khoảng trắng, v.v.

Chỉ đưa ra nhưng các quy tắc xử lý khoảng trắng, tôi tin rằng đây là mục đích rõ ràng của các nhà thiết kế XML.


một trong số ít lời giải thích tôi có thể đọc. không biết liệu đó có phải là một ý tưởng tốt hay không ... nhưng ít nhất tôi hiểu được vấn đề;)
Thufir

0

Điều này rất rõ ràng trong HTML nơi có thể thấy rõ sự khác biệt của các thuộc tính và đánh dấu:

  1. Tất cả dữ liệu nằm giữa đánh dấu
  2. Các thuộc tính được sử dụng để mô tả dữ liệu này (ví dụ: định dạng)

Nếu bạn chỉ có dữ liệu thuần túy như XML, có một sự khác biệt ít rõ ràng hơn. Dữ liệu có thể đứng giữa đánh dấu hoặc là thuộc tính.

=> Hầu hết dữ liệu nên đứng giữa đánh dấu.

Nếu bạn muốn sử dụng các thuộc tính ở đây: Bạn có thể chia dữ liệu thành hai loại: Dữ liệu và "dữ liệu meta", trong đó dữ liệu meta không phải là một phần của bản ghi, bạn muốn trình bày, nhưng những thứ như "phiên bản định dạng", "ngày tạo" , Vân vân.

<customer format="">
     <name></name>
     ...
</customer>

Người ta cũng có thể nói: "Sử dụng các thuộc tính để mô tả thẻ, sử dụng thẻ để cung cấp dữ liệu."


-1

Tôi đồng ý với feenster. Tránh xa các thuộc tính nếu bạn có thể. Các yếu tố thân thiện với sự tiến hóa và khả năng tương tác nhiều hơn giữa các bộ công cụ dịch vụ web. Bạn sẽ không bao giờ tìm thấy các bộ công cụ này nối tiếp các thông điệp yêu cầu / phản hồi của bạn bằng các thuộc tính. Điều này cũng có ý nghĩa vì các thông điệp của chúng tôi là dữ liệu (không phải siêu dữ liệu) cho bộ công cụ dịch vụ web.


-1

Các thuộc tính có thể dễ dàng trở nên khó quản lý theo thời gian tin tưởng tôi. Tôi luôn tránh xa họ. Các yếu tố rõ ràng hơn và có thể đọc / sử dụng được bởi cả trình phân tích cú pháp và người dùng.

Chỉ có thời gian tôi từng sử dụng chúng là để xác định phần mở rộng tệp của url tài sản:

<image type="gif">wank.jpg</image> ...etc etc

Tôi đoán nếu bạn biết 100% thuộc tính sẽ không cần phải mở rộng, bạn có thể sử dụng chúng, nhưng bạn biết điều đó bao nhiêu lần.

<image>
  <url>wank.jpg</url>
  <fileType>gif</fileType>
</image>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.