Perché? perché non vuoi scrivere validatori tu stesso, e se lo fai, è molto probabile che tu non abbia esperienza nel farlo, e quando hai bisogno di cambiarlo per soddisfare i nuovi requisiti, avrai un tempo terribile.
Nonostante la credenza comune, XML non è rigido; Finché il tuo XML è sintatticamente corretto, è un XML valido, nonostante le persone ignoranti ti dicano il contrario.
VUOI convalidare il tuo XML se le tue applicazioni (sia esso web o altro) si basano su modelli (non necessariamente XML, perché qualsiasi modello può essere trasformato in XML scrivendo un semplice programma tree walking) per comportarsi correttamente.
Ad esempio, potresti avere un modello JSON per i colori
[
{"name": "red", "cssxrgb": "#ff0000"},
{"name": "blue", "cssxrgb": "#00ff00"},
{"name": "green", "cssxrgb": "#0000ff"}
]
La maggior parte dei programmatori, se viene richiesto di scrivere un programma per assicurarsi che tutte le voci in questo array siano valide e dire cosa non è valido quando non lo è, scriverà qualcosa di questo odore:
var jsonString = '
[
{"name": "red", "cssxrgb": "#ff0000"},
{"name": "blue", "cssxrgb": "#00ff00"},
{},
{"name": "green", "cssxrgb": "#0000ff"}
]
';
var data = JSON.parse(jsonString);
for (var i = 0; i < data.length; ++i) {
var row = data[i];
if (!row.hasOwnProperty('name')) {
throw new TypeError('row #' + i + " is missing required property name");
}
if (!row.hasOwnProperty('cssxrgb')) {
throw new TypeError('row #' + i + " is missing required property cssxrgb");
}
}
Può essere difficile da mantenere, richiede una codifica molto attenta ed è molto fragile per errori di battitura, cambi di campo, ecc.
Un semplice programma può essere scritto per trasformare il precedente in XML, e molti modelli hanno già molti trasformatori online da loro in XML. Non deve nemmeno essere un buon trasformatore, è più semplice cambiare il metodo di trasformazione dei dati in xml che modificare i validatori personalizzati. Ecco un esempio per la trasformazione di cui sopra in
<colors><color name="red" cssxrgb="#ff0000" /><color name="blue" cssxrgb="#00ff00" /><color name="green" cssxrgb="#0000ff" /></colors>
codice di trasformazione:
var jsonString = '
[
{"name": "red", "cssxrgb": "#ff0000"},
{"name": "blue", "cssxrgb": "#00ff00"},
{"name": "green", "cssxrgb": "#0000ff"}
]
';
var data = JSON.parse(jsonString);
var xmlString = '<colors>';
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var name = row.name;
var cssxrgb = row.cssxrgb;
var keys = Object.keys(row);
xmlString += '<color ';
var tmp = [];
for (var j = 0; j < keys.length; ++j) {
var key = keys[j];
var value = row[key];
tmp.push('${key}="${value}"');
}
xmlString += tmp.join(', ') + ' />';
}
xmlString += '</colors>';
console.log(xmlString);
Ora per convalidare, tutto ciò che devi fare è eseguirlo sul doctype come
<!ELEMENT colors (color*)>
<!ELEMENT color EMPTY>
<!ATTLIST color name CDATA #REQUIRED>
<!ATTLIST color cssxrgb CDATA #REQUIRED>
Puoi verificarlo con i validatori online come tali
<!DOCTYPE colors [
<!ELEMENT colors (color*)>
<!ELEMENT color EMPTY>
<!ATTLIST color name CDATA #REQUIRED>
<!ATTLIST color cssxrgb CDATA #REQUIRED>
]>
<colors><color name="red" cssxrgb="#ff0000" /><color name="blue" cssxrgb="#00ff00" /><color name="green" cssxrgb="#0000ff" /></colors>
I rigidi validatori rifiuteranno il modello se contiene attributi / elementi non dichiarati nella DTD, il che è utile quando i programmi sono fragili in chiave, coppie di valori che non si aspettano. Il problema è se un validatore smette di convalidare dopo il primo errore o se ci sono troppi falsi positivi come i tag non dichiarati rispetto alle violazioni delle cose che il tuo doctype in realtà chiede di verificare.
Se sai come scrivere i tuoi validatori, puoi spesso scrivere quelli migliori più velocemente della scrittura dei tuoi trasformatori model-to-xml e del tuo doctype, ma anche in questo caso, è più facile cambiare un DTD esistente o model to xml transformer che dover modificare il proprio validatore personalizzato.
Come per HTML / SVG / altri formati comuni; Di solito sono XML non validi, ma se si sceglie di renderli XML validi, si ha la possibilità di aggiungere i propri tag che vengono ignorati dal documento se li si disegna in display: none
, ma si ha ancora un feedback quando si esegue accidentalmente un errore di battitura nel proprio modello. Questo è utile per cose come i modelli angolari, i metadati personalizzati che vengono gestiti da JavaScript quando determinati eventi si innescano.
Nel peggiore dei casi, ti consente di stabilire quali parti del DOM sono "standard" e quali sono i metadati (es. author
tag in head) / custom (ad es. gallery
tag che angularjs trasforma in seguito) / dati spazzatura (errori di battitura, metadati non più necessari, così via), in entrambi i casi questi tag personalizzati introducono complessità nel modello e la convalida di xml può aiutarti a capire quali parti del DOM potrebbero essere le cause più guai.
Per riassumere qui ci sono i vantaggi della convalida
-
è validabile - anche se non usa la validazione, puoi almeno sapere che è possibile validarlo perché ha una struttura XML sintatticamente corretta, che ti permette di convalidarlo quando vuoi o quando è necessario.
-
Aiuta a trovare parti di DOM che un programma a seconda del modello potrebbe non aspettarsi.
-
È più semplice scrivere e gestire un semplice validatore trasformando in XML e scrivendo un DOCTYPE e scegliendo quale DOCTYPE utilizzare su una specifica esecuzione di validazione rispetto alla scrittura del proprio validatore. È anche più semplice correggere i casi limite nel tuo trasformatore personalizzato, doctype che all'interno di un validatore personalizzato.
-
Può sfruttare le tecnologie XML: se è un XML valido, può utilizzare facilmente molte delle tecnologie XML come XSL. Queste tecnologie di solito aggiungono molta complessità rispetto al fare le cose in modo convenzionale, ma consentono di controllare il tuo documento in modo piuttosto efficace una volta che ti senti a tuo agio con qualsiasi di esse.