Sembra che tutti i principali browser implementano l'API DOMParser in modo che XML può essere analizzato in un DOM e poi interrogato utilizzando XPath, getElementsByTagName, ecc ...Come posso rilevare errori di analisi XML durante l'utilizzo di DOMParser di Javascript in modalità cross-browser?
Tuttavia, rilevando errori di analisi sembra essere più complicato. DOMParser.prototype.parseFromString
restituisce sempre un DOM valido. Quando si verifica un errore di analisi, il DOM restituito contiene un elemento <parsererror>
, ma è leggermente diverso in ciascun browser principale.
Esempio JavaScript:
xmlText = '<root xmlns="http://default" xmlns:other="http://other"><child><otherr:grandchild/></child></root>';
parser = new DOMParser();
dom = parser.parseFromString(xmlText, 'text/xml');
console.log((new XMLSerializer()).serializeToString(dom));
Risultato in Opera:
radice di DOM è un elemento <parsererror>
.
<?xml version="1.0"?><parsererror xmlns="http://www.mozilla.org/newlayout/xml/parsererror.xml">Error<sourcetext>Unknown source</sourcetext></parsererror>
Risultato in Firefox: root
di DOM è un elemento <parsererror>
.
<?xml-stylesheet href="chrome://global/locale/intl.css" type="text/css"?>
<parsererror xmlns="http://www.mozilla.org/newlayout/xml/parsererror.xml">XML Parsing Error: prefix not bound to a namespace
Location: http://fiddle.jshell.net/_display/
Line Number 1, Column 64:<sourcetext><root xmlns="http://default" xmlns:other="http://other"><child><otherr:grandchild/></child></root>
---------------------------------------------------------------^</sourcetext></parsererror>
Risultato in Safari:
L'elemento <root>
analizza correttamente, ma contiene un nidificato <parsererror>
in uno spazio diverso da Opera e Firefox dell'elemento <parsererror>
.
<root xmlns="http://default" xmlns:other="http://other"><parsererror xmlns="http://www.w3.org/1999/xhtml" style="display: block; white-space: pre; border: 2px solid #c77; padding: 0 1em 0 1em; margin: 1em; background-color: #fdd; color: black"><h3>This page contains the following errors:</h3><div style="font-family:monospace;font-size:12px">error on line 1 at column 50: Namespace prefix otherr on grandchild is not defined
</div><h3>Below is a rendering of the page up to the first error.</h3></parsererror><child><otherr:grandchild/></child></root>
mi manca un modo semplice e cross-browser di rilevare se un errore di analisi si è verificato in qualsiasi parte del documento XML? O devo interrogare il DOM per ciascuno dei possibili elementi <parsererror>
che potrebbero essere generati da diversi browser?
È sufficiente chiamare '.getElementsByTagName (" parseerror ")' sul nodo DOM radice e presupporre che si sia verificato un errore se la lunghezza dell'elenco dei nodi restituiti è maggiore di zero? – Pointy
Tecnicamente il documento XML che sto analizzando potrebbe contenere '' elementi, ma è ancora totalmente XML valido (gli elementi sarebbero da un diverso spazio dei nomi) Quindi dovrei effettuare più chiamate a '.getElementsByTagNameNS (spazio dei nomi, 'parsererror ') 'per gli URI' namespace' da ciascun browser. –
cspotcode
Hmm. Bene, le specifiche HTML5 per questo sono frammentarie, per non dire altro. – Pointy