Создать 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]
}