Невозможно создать XML node с кириллическим именем в IE11

Мне нужно создать XML-документ (с JavaScript), содержащий узлы, который называется по-русски.

Я получаю InvalidCharacterError в IE11 при попытке запустить doc.createElement("Выборка")

doc создается с помощью var doc = document.implementation.createDocument("", "", null)

В других браузерах этот код работает без каких-либо проблем.

Как можно решить? В чем корень проблемы?

Пример jsFiddle: http://jsfiddle.net/e4tUH/1/

Мой пост на connect.microsoft.com: https://connect.microsoft.com/IE/feedback/details/812130/cant-create-xml-node-with-cyrillic-name-in-ie11

Текущее обходное решение. Переключите IE11 в IE10 с метатегом X-UA-Compatible и используйте window.ActiveXObject(...) для создания XML-документов.

Ответ 1

Возможно, у IE11 есть проблема, аналогичная тому, что имел в прошлом Firefox:

https://bugzilla.mozilla.org/show_bug.cgi?id=431701

Это означает, что, хотя ваша страница загружает правильную кодировку, IE11 создает новый документ с кодировкой по умолчанию, которая не является ожидаемой. Невозможно проверить, что, кроме поиска исходного кода IE11, которого у нас нет.

Вы пытаетесь добавить символы, отличные от ASCII, в других местах, кроме имен элементов? Как значение атрибута или текст node?

Я искал способ изменения созданной кодировки документа и не нашел для этого решения.

Чтобы решить вашу проблему, я бы предложил использовать DOMParser и сгенерировать документ из XML-строки, например:

var parser=new DOMParser();
var xmlDoc=parser.parseFromString('<?xml version="1.0" encoding="UTF-8"?><Выборка>Выборка текста</Выборка>',"text/xml");

Все браузеры, похоже, поддерживают его для разбора XML. Подробнее о DOMParser о следующих ссылках, в том числе о том, как обеспечить обратную совместимость со старыми версиями IE:

http://www.w3schools.com/dom/dom_parser.asp

https://developer.mozilla.org/en-US/docs/Web/API/DOMParser

Если вы не хотите генерировать свой XML, просто конкатенируя строки, вы можете использовать какой-то XML-построитель, как в этом примере: http://jsfiddle.net/UGYWx/6/

Затем вы можете легко создать свой XML более безопасно:

var builder = new XMLBuilder("rootElement");
builder.text('Some text');

var element = builder.element("someElement", {'attr':'value'});
element.text("This is a text.");

builder.text('Some more Text');
builder.element("emptyElement");
builder.text('Even some more text');

builder.element("emptyWithAttributes", {'a1': 'val1', 'a2' : 'val2'});

$('div').text(builder.toString());

Ответ 2

Я всегда очень неохотно использовал символы, отличные от ASCII, внутри исходного кода. Попробуйте избежать строки; возможно, это помогает.

doc.createElement("\u0412\u044B\u0431\u043E\u0440\u043A\u0430")