Как обнаружить ошибки синтаксического анализа XML при использовании DOMParser Javascript в кросс -браузере?

Кажется, что все основные браузеры реализуют DOMParser API, так что XML можно анализировать в DOM, а затем запрашивать с помощью XPath, getElementsByTagName и т. д.

Однако обнаружение ошибок синтаксического анализа кажется более сложным. DOMParser.prototype.parseFromStringвсегда возвращает правильный DOM. Когда возникает ошибка синтаксического анализа, возвращаемый DOM содержит элемент <parsererror>, но он немного отличается в каждом основном браузере.

Пример 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));

Результат в Опере:

Корень DOM — это элемент <parsererror>.

<?xml version="1.0"?><parsererror xmlns="http://www.mozilla.org/newlayout/xml/parsererror.xml">Error<sourcetext>Unknown source</sourcetext></parsererror>

Результат в Firefox:

Корень DOM — это элемент <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>&lt;root xmlns="http://default" xmlns:other="http://other"&gt;&lt;child&gt;&lt;otherr:grandchild/&gt;&lt;/child&gt;&lt;/root&gt;
---------------------------------------------------------------^</sourcetext></parsererror>

Результат в Safari:

Элемент <root>анализируется правильно, но содержит вложенный элемент <parsererror>в пространстве имен, отличном от элемента Opera и Firefox <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>

Я пропустил простой, кросс-браузерный -способ обнаружения ошибки синтаксического анализа где-либо в XML-документе? Или я должен запрашивать DOM для каждого из возможных элементов <parsererror>, которые могут генерировать разные браузеры?

24
задан cspotcode 19 July 2012 в 14:56
поделиться