Создать XML DOM элемент, сохраняя чувствительность к регистру

Я пытаюсь создать следующий элемент nodetree:

<v:custProps>
    <v:cp v:nameU="Cost">
</v:custProps>

с:

newCustprop = document.createElement("v:custProps");
newcp = document.createElement("v:cp");
newcp.setAttribute("v:nameU", "Cost");
newCustprop.appendChild(newcp);

Тем не мение, document.createElement("v:custProps") генерирует <v:custprops> в отличие от <v:custProps>, Есть ли способ избежать этого анализа?


Изменить 1:

В настоящее время я читаю эту статью о чувствительности к регистру имен. Это немного не имеет отношения к моей проблеме, потому что мой код не разбирается с <![CDATA]]> и я бы предпочел не использовать .innerHTML,

3 ответа

Решение

Вам нужно использовать createElementNS()/setAttributeNS() и предоставить пространство имен, а не только псевдоним / префикс. В примере используются urn:v как пространство имен.

var xmlns_v = "urn:v";
var newCustprop = document.createElementNS(xmlns_v, "v:custProps");
var newcp = document.createElementNS(xmlns_v, "v:cp");
newcp.setAttributeNS(xmlns_v, "v:nameU", "Cost");
newCustprop.appendChild(newcp);

var xml = (new XMLSerializer).serializeToString(newCustprop);

XML:

<v:custProps xmlns:v="urn:v"><v:cp v:nameU="Cost"/></v:custProps>

Не рекомендуется использовать document.createElement для квалифицированных имен. Посмотрите, если document.createElementNS может лучше служить вашим целям.

У меня все еще были проблемы, когда createElementNs прикреплял атрибут "xmls" к моей строке об использованииnew XMLSerializer().serializeToString(xmlDoc).

В итоге я использовал следующую функцию для создания элементов с именами тегов, чувствительными к регистру:

      function createElement(tagName) {
  const doc = new DOMParser().parseFromString(`<${tagName}></${tagName}>`, 'text/xml')
  return doc.children[0]
}
Другие вопросы по тегам