Use of Elements vs. Attributes
Data
can be stored in child elements or in attributes.
Take
a look at these examples:
<person
sex="female">
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
<person>
<sex>female</sex>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
<sex>female</sex>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
In
the first example sex is an attribute. In the last, sex is a child element.
Both examples provide the same information.
There
are no rules about when to use attributes, and when to use child elements. My
experience is that attributes are handy in HTML, but in XML you should try to
avoid them. Use child elements if the information feels like data.
Way
I like to store data in child elements.
The
following three XML documents contain exactly the same information:
A
date attribute is used in the first example:
<note
date="12/11/2002">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
A
date element is used in the second example:
<note>
<date>12/11/2002</date>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
<date>12/11/2002</date>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
An
expanded date element is used in the third: (THIS IS MY FAVORITE):
<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>
<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>
Avoid using attributes?
Should
you avoid using attributes?
Some
of the problems with attributes are:
- attributes cannot contain
multiple values (child elements can)
- attributes are not easily
expandable (for future changes)
- attributes cannot describe
structures (child elements can)
- attributes are more difficult
to manipulate by program code
- attribute values are not easy
to test against a DTD
If
you use attributes as containers for data, you end up with documents that are
difficult to read and maintain. Try to use elements to describe data. Use
attributes only to provide information that is not relevant to the data.
Don't
end up like this (this is not how XML should be used):
<note
day="12" month="11" year="2002"
to="Tove" from="Jani" heading="Reminder"
body="Don't forget me this weekend!">
</note>
to="Tove" from="Jani" heading="Reminder"
body="Don't forget me this weekend!">
</note>
An Exception to my Attribute Rule
Rules
always have exceptions.
My
rule about attributes has one exception:
Sometimes
I assign ID references to elements. These ID references can be used to access
XML elements in much the same way as the NAME or ID attributes in HTML. This
example demonstrates this:
<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>
<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>
The
ID in these examples is just a counter, or a unique identifier, to identify the
different notes in the XML file, and not a part of the note data.
What
I am trying to say here is that metadata (data about data) should be stored as
attributes, and that data itself should be stored as elements.
No comments:
Post a Comment