Appendix A. Notes on Processing XML Elements (Note sull'elaborazione degli elementi XML)
Appendice A. Notes on Processing XML Elements (Note sull'elaborazione degli elementi XML)
A.1. Notes on Empty XML Elements (Note sugli elementi XML vuoti)
XML supporta due meccanismi per indicare che un elemento XML non ha alcun contenuto. Il primo è dichiarare un elemento XML della forma <A></A>. Il secondo è dichiarare un elemento XML della forma <A/>. I due elementi XML sono semanticamente identici.
A.2. Notes on Illegal XML Processing (Note sull'elaborazione XML illegale)
XML è un formato di dati flessibile che rende facile inviare dati che appaiono legali ma in realtà non lo sono. La filosofia "Sii flessibile in ciò che accetti e rigoroso in ciò che invii" si applica ancora, ma non deve essere applicata in modo inappropriato. XML è estremamente flessibile nel gestire questioni di spazi bianchi, ordinamento degli elementi, inserimento di nuovi elementi, ecc. Questa flessibilità non richiede estensioni, soprattutto non nell'area del significato degli elementi.
Non c'è gentilezza nell'accettare combinazioni illegali di elementi XML. Nel migliore dei casi, causerà un risultato indesiderato e nel peggiore dei casi può causare danni reali.
A.3. Example - XML Syntax Error (Esempio - Errore di sintassi XML)
Il seguente corpo della richiesta per un metodo PROPFIND è illegale.
<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:">
<D:allprop/>
<D:propname/>
</D:propfind>
La definizione dell'elemento propfind consente solo l'elemento allprop o l'elemento propname, non entrambi. Pertanto, quanto sopra è un errore e deve ricevere una risposta 400 (Bad Request).
Immagina, tuttavia, che un server volesse essere "gentile" e decidesse di scegliere l'elemento allprop come elemento vero e rispondere ad esso. Un client in esecuzione su una linea con larghezza di banda limitata che intendeva eseguire un propname sarebbe molto sorpreso se il server trattasse il comando come un allprop.
Inoltre, se un server fosse indulgente e decidesse di rispondere a questa richiesta, i risultati varierebbero casualmente da server a server, con alcuni server che eseguono la direttiva allprop e altri che eseguono la direttiva propname. Questo riduce l'interoperabilità piuttosto che aumentarla.
A.4. Example - Unexpected XML Element (Esempio - Elemento XML inaspettato)
L'esempio precedente era illegale perché conteneva due elementi che erano esplicitamente vietati dall'apparire insieme nell'elemento propfind. Tuttavia, XML è un linguaggio estensibile, quindi si possono immaginare nuovi elementi definiti per l'uso con propfind. Di seguito è riportato il corpo della richiesta di un PROPFIND e, come l'esempio precedente, deve essere rifiutato con un 400 (Bad Request) da un server che non comprende l'elemento expired-props.
<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:"
xmlns:E="http://www.example.com/standards/props/">
<E:expired-props/>
</D:propfind>
Per capire perché viene restituito un 400 (Bad Request), esaminiamo il corpo della richiesta come lo vede il server non familiare con expired-props.
<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:"
xmlns:E="http://www.example.com/standards/props/">
</D:propfind>
Poiché il server non comprende l'elemento 'expired-props', secondo le regole di elaborazione XML specifiche di WebDAV specificate nella Sezione 17, deve elaborare la richiesta come se l'elemento non fosse presente. Quindi, il server vede un propfind vuoto, che secondo la definizione dell'elemento propfind è illegale.
Si noti che se l'estensione fosse stata additiva, non avrebbe necessariamente portato a un 400 (Bad Request). Ad esempio, immagina il seguente corpo della richiesta per un PROPFIND:
<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:"
xmlns:E="http://www.example.com/standards/props/">
<D:propname/>
<E:leave-out>*boss*</E:leave-out>
</D:propfind>
L'esempio precedente contiene l'elemento fittizio leave-out. Il suo scopo è impedire la restituzione di qualsiasi proprietà il cui nome corrisponda al pattern inviato. Se l'esempio precedente fosse inviato a un server non familiare con 'leave-out', l'unico risultato sarebbe che l'elemento 'leave-out' verrebbe ignorato e verrebbe eseguito un propname.