У меня есть минимальный фрагмент JavaScript:
var xml = '<El a:title="T" a:href="H" xmlns:a="http://www.w3.org/1999/xlink" />';
var dom = new DOMParser().parseFromString(xml, 'text/xml');
xml = new XMLSerializer().serializeToString(dom);
Когда я выполняю код в большинстве браузеров (просто вставьте его в консоль JavaScript браузера), XML-синтаксический анализ с последовательным интерфейсом эквивалентен оригиналу. Например, в Chrome 8 я получаю:
<El xmlns:a="http://www.w3.org/1999/xlink" a:title="T" a:href="H"/>
Однако в Chrome 22 тот же фрагмент кода изменяет XML на:
<El xmlns:a="http://www.w3.org/1999/xlink" xlink:title="T" xlink:href="H"/>
Обратите внимание, что префикс пространства имен xlink
, используемый атрибутами title и href, не определен нигде, поэтому XML теперь недействителен. Как вы, вероятно, можете себе представить, это вызывает всевозможные проблемы для кода, который пытается впоследствии использовать XML.
Является ли это ошибкой в XMLSerializer или мне не хватает некоторых тонкостей о том, как DOM следует сериализовать?
Также кто-нибудь нашел обходное решение, которое я могу поместить в код, в отличие от того, чтобы XML соответствовал очевидному предпочтению использовать xlink
в качестве префикса для пространства имен XLink?
Update
Я провел некоторое дополнительное тестирование, и проблема, похоже, вызвана тем фактом, что XMLSerializer распознает пространство имен XLink и настаивает на выводе префикса xlink
для него, без должной регистрации этого префикса.
Итак, этот фрагмент работает нормально:
var xml = '<El a:title="T" a:href="H" xmlns:a="any-other-namespace-uri" />';
var dom = new DOMParser().parseFromString(xml, 'text/xml');
xml = new XMLSerializer().serializeToString(dom);
Итак, здесь я изменил URL-адрес пространства имен на что-то менее известное, и результат теперь действителен:
<El xmlns:a="any-other-namespace-uri" a:title="T" a:href="H"/>
Следующий фрагмент также отлично работает:
var xml = '<El a:title="T" a:href="H" xmlns:a="http://www.w3.org/2000/xlink" />';
var dom = new DOMParser().parseFromString(xml, 'text/xml');
xml = new XMLSerializer().serializeToString(dom);
Итак, в этом случае мы используем "ожидаемый" префикс для пространства имен XLink и затем сериализуем без проблем:
<El xmlns:a="http://www.w3.org/2000/xlink" a:title="T" a:href="H"/>