2008-12-27 14 views
23

Quale sarebbe il formato corretto per questi dati XML, sono equivalenti o ci sono trade off tra i due?Best practice: attributo XML vs elemento XML - Quando dovrei usare gli elementi e quando dovrei usare gli attributi?

1.

<sitemap> 
    <category name="Animals"> 
    <section title="Dogs"> 
     <page url="/pics/greatdane.jpg" title="Great Dane"/> 
    </section> 
    </category> 
</sitemap> 

2.

<sitemap> 
    <page> 
    <category>Animals</category> 
    <section>Dogs</section> 
    <title>Great Dane</title> 
    <url>/pics/greatdane.jpg</url>  
    </page> 
</sitemap> 

Ho implementato il primo esempio con il mio foglio di stile e sembra funzionare bene, ma io sono sicuro che cosa la forma corretta dovrebbe essere.

+1

Questa è una buona domanda con un brutto titolo. –

+0

Sì, davvero una bella domanda, ma per favore cambia il titolo. –

risposta

20

Il problema degli attributi vs elementi è stato intorno per la parte migliore di un decennio e non c'è una risposta giusta. Considerate invece le differenze e da questo dovreste essere in grado di decidere quale usare:

  • Ci può essere solo un'istanza di un attributo sebbene sia possibile imporla con elementi che utilizzano DTD o XML Schema;
  • Gli attributi non sono ordinati. Gli elementi non lo sono;
  • Gli attributi portano a una sintassi più concisa se non ci sono bambini.Confronta:

    < nome della pagina = "Sitemap" />

a:

<page> 
    <name>Sitemap</name> 
</page> 

So che quello che preferisco;

  • Non proprio rilevante ora, poiché DTD non sono usati molto (se non del tutto) su XML Schema, ma io aggiungo che in ogni caso: DTD permettono valori di default (implicita) per gli attributi, ma non tale meccanismo per gli elementi; e
  • Gli elementi, essendo elementi, possono avere figli e attributi propri. Gli attributi ovviamente non possono.

Quindi, dal vostro esempio, il tuo intimo <page> elemento ha un attributo URL (anche se è un'immagine per qualche motivo -? Forse un icona di anteprima Se è così il nome dell'attributo è fuorviante). Una pagina web ha solo un URL (generalmente), quindi sarebbe un buon esempio di qualcosa che potrebbe essere un attributo.

Se invece si desidera elencare le immagini sulla pagina, ci potrebbe essere ovviamente più di una così avresti bisogno di elementi per quello.

Ma, alla fine, la maggior parte delle volte non c'è una risposta giusta o sbagliata ed è in gran parte una questione di stile.

+0

Dici "nodo", ma intendi "elemento". Anche le istruzioni di elaborazione, i commenti e il testo sono nodi. Questa è una distinzione importante per la comprensione di molte complessità di XML, come la funzione XPath node(). –

+0

Giusto. Corretto. – cletus

+0

Un'altra cosa da aggiungere è che se si utilizza XSL per trasformare l'XML non c'è modo di decodificare le entità all'interno degli attributi (http://stackoverflow.com/questions/67859/xslt-cannot-get-xslt-to-output-an -anche-dopo-fuga-the-carattere # 86.934). – null

2

Di solito non ci sono risposte giuste o sbagliate per questo genere di cose. Principalmente dipende da come è necessario accedere ai dati.

Una cosa carina del primo è che facilmente, forse più tardi, supporta più pagine in una sezione e più sezioni in una categoria. Nella seconda le informazioni sono distribuite tra le pagine.

2

XML è un formato di file orribile e finisce nelle guerre di religione. Fai ciò che senti meglio in quel momento, purché tu possa giustificarlo. Tuttavia, i vostri esempi particolari sono significativamente differenti:

In 1, la sitemap incapsula una categoria che incapsula una sezione che incapsula la pagina.

In 2, la sitemap racchiude una pagina che racchiude tre elementi: categoria, sezione, titolo e URL. Nessuno di questi tre elementi contiene alcun altro, sono fratelli, tutti comunemente contenuti all'interno della pagina.

Come due diverse strutture, dipende da quale si intendeva.

Una domanda diversa sarebbe la preferenza per gli attributi rispetto ai tag di primo livello. Ma come ho detto, questa è una domanda diversa!

1

Preferisco il secondo. Gli elementi dovrebbero essere usati per descrivere i dati (che è principalmente ciò che stai facendo). Gli attributi vengono utilizzati per valori non rilevanti per i dati, come ad esempio la dimensione massima per un elemento.

12

I due esempi non sono equivalenti, poiché formano gerarchie diverse. Una sitemap è una lista di categorie, come il primo esempio? O è una lista di pagine come il secondo esempio?

La risposta è ortogonale alla domanda elemento vs attributo.

sull'elemento vs domanda Attributo: Ecco il vostro secondo esempio trasformato in un approccio attributo:

<sitemap> 
<page  
    category='Animals' 
    section='Dogs' 
    title='Great Dane' 
    url='/pics/greatdane.jpg' 
    /> 
</sitemap> 

Il sopra e il tuo secondo caso sono equivalenti. Una considerazione per la scelta dell'uno rispetto all'altra si basa sulla possibilità di modificare lo schema in futuro. Aggiungere un attributo all'elemento url come nell'esempio seguente potrebbe essere una modifica compatibile con le versioni precedenti. La semantica stessa modifica sarebbe impossibile nell'approccio dell'attributo, poiché non è possibile allegare un attributo a un attributo.

<sitemap> 
<page>  
    <category>Animals</category> 
    <section>Dogs</section>  
    <title>Great Dane</title>  
    <url nofollow="true">/pics/greatdane.jpg</url> 
</page> 
</sitemap> 
1

IBM ha pubblicato un articolo intitolato Principles of XML Design che fornisce alcune linee guida su quando utilizzare gli attributi contro gli elementi. Ho trovato utile questo articolo, il tuo chilometraggio può variare.

1

La prima alternativa scale un po 'meglio. Supponi di aver bisogno di aggiungere un altro attributo di una sezione animale, come lo stato della sezione.Suggerisco che questa rappresentazione:

<sitemap> 
    <category name="Animals"> 
    <section title="Dogs" status="draft"> 
     ... 
    </section> 
    </category> 
</sitemap> 

fa un lavoro migliore di trasmettere i seguenti fatti:

  1. nome è una proprietà della categoria
  2. una categoria potrebbe avere più sezioni
  3. stato è una proprietà di una sezione; non tutte le sezioni della categoria devono avere lo stesso stato.

In breve, rende più chiara la struttura gerarchica e mostra quali attributi si applicano a ciascun livello della gerarchia.

3

Penso che la risposta è abbastanza evidente quando si pensa a come si desidera aggiungere più cani:

<sitemap> 
    <category name="Animals"> 
    <section title="Dogs"> 
     <page url="/pics/greatdane.jpg" title="Great Dane"/> 
     <page url="/pics/wienerdog.jpg" title="Wiener Dog"/> 
    </section> 
    </category> 
</sitemap> 

o

<sitemap> 
    <page> 
    <category>Animals</category> 
    <section>Dogs</section> 
    <title>Great Dane</title> 
    <url>/pics/greatdane.jpg</url>  
    </page> 
    <page> 
    <category>Animals</category> 
    <section>Dogs</section> 
    <title>Wiener Dog</title> 
    <url>/pics/wienerdog.jpg</url> 
    </page> 
</sitemap> 
1

Una semplice regola empirica: se è possibile implementare un struttura dei dati come una mappa non ordinata di coppie nome/valore, è possibile utilizzare gli attributi di un elemento per rappresentarlo. Se non puoi (se, ad esempio, avrai più nomi, o un nome dato avrà più valori associati, o l'ordine delle coppie nome/valore è significativo), allora un elemento con attributi è la rappresentazione sbagliata . altri

Due cose che possono rendere questo la rappresentazione sbagliata:

  • I valori contengono il markup. Questo può rappresentare nei valori di attributo, ma è scomodo, poiché tutti i caratteri di markup devono essere sfuggiti in entità. Inoltre, il markup non verrà analizzato.
  • Si sta utilizzando la convalida dello schema XML e sono disponibili più coppie di coppie nome/valore. Lo schema XML può solo definire un set di attributi consentiti per un elemento, mentre può definire più insiemi mutuamente esclusivi di elementi figli consentiti.

L'ovvio vantaggio nell'utilizzo degli attributi è il loro risultato in XML terser. Sono (molto) marginalmente più veloci da analizzare rispetto agli elementi.

Problemi correlati