Indipendentemente dal gusto personale, qui è l'insieme fondamentale di problemi:
utilizzare gli attributi per mappare i valori di nomi univoci in fase d'ordine non è significativo. Altrimenti, usa gli elementi.
- Valori: numeri, stringhe, date, ecc., Ma non oggetti multi-proprietà.
- Nome univoco: ogni nome di attributo su un elemento deve essere univoco. Se una cosa rappresentata da un elemento può avere più di una Foo ad essa associata, Foo non dovrebbe essere un attributo.
- L'ordine non è significativo: l'applicazione non può dipendere dai valori presentati ai processi in un ordine particolare.
Un esempio: se si desidera eseguire il round-trip dei dati tra (ad esempio) ADO.NET e XML, è necessario memorizzare i valori delle colonne in attributi o elementi? (Non importa per un momento che ADO.NET faccia questo per te.) Bene, i nomi delle colonne mappano i valori in modo univoco ei valori delle colonne sono tipi di dati facilmente serializzabili. Quindi, sicuro, perché non farlo?
<Person FirstName="John" MiddleName="Q." LastName="Smith"/>
Ma in realtà questa è una trasformazione che distrugge le informazioni. L'ordine in cui le colonne vengono visualizzate in un record ADO.NET è significativo. Se qualcosa è nella colonna 2 prima della trasformazione, dovrebbe essere in seguito nella colonna 2. La loro conversione in attributi perderà queste informazioni. (So che un'implementazione DOM, per esempio, che recupera gli attributi in ordine alfabetico per nome.)
Questo è il motivo per ADO.NET rappresenta righe come questo, anche se è verbose:
<Person>
<FirstName>John</FirstName>
<MiddleName>Q.</MiddleName>
<LastName>Smith</LastName>
</Person>
Per quanto riguarda il opinione comune che gli elementi sono per informazioni, e gli attributi sono per metainformazione: questo è spesso molto buoni consigli. Spesso è anche solo la superstizione che ti porterà in posti brutti.
Per uno, metainformation potrebbe dover contenere più valori associati con lo stesso nome. Si potrebbe, per esempio, vuole contrassegnare un elemento con un elenco di pagine che lo utilizzeranno:
<Person Pages="B1,B2,B3,B4">
<FirstName>John...
mai provato a scrivere un modello XSLT che analizza un elenco separato da virgole? Imparerete molto da fare, ma probabilmente non è qualcosa che si desidera sapere.
Per un altro, i progettisti di XML che non sanno cosa stanno facendo contro lasciare che questo consiglio li portano a mettere in un attributo ciò che in realtà dovrebbe essere nel nome del tag dell'elemento. Ad esempio:
<Person Type="Employee">
<SSN>123-45-6789</SSN>
<Extension>123</Extension>
</Person>
<Person Type="Customer">
<PhoneNumber>123-456-7890</PhoneNumber>
<BillingAddress>...
e così via.Indovina cosa succede quando provi a scrivere uno schema che impone regole diverse sugli elementi Person
in base all'attributo Type
? Fallimento. Gli schemi sono legati al nome dell'elemento. Tutti gli elementi Person
devono avere lo stesso schema. In questo caso, gli elementi dovrebbero essere denominati Employee
e Customer
.
La distinzione tra "attributo" e "dati" in questo esempio non è chiara (per non dire altro). Inoltre, non vedo alcun motivo per cui gli attributi rendano le cose "più difficili" quando si lavora con XSLT: sta usando il prefisso @ così difficile? –
Robert: Mi occupo di un'applicazione in cui alcuni dati vengono estratti dal database e altri dati vengono estratti da un file XML. Con gli Attributi come sono, devo trasformare quell'XML in XML in cui posso inserire dati, e quindi trasformare quell'XML in HTML. Ecco perchè. –