创建 XML DOM 元素,同时保持区分大小写

Create XML DOM Element while keeping case sensitivity

本文关键字:持区 大小写 XML DOM 元素 创建      更新时间:2023-09-26

我正在尝试创建以下元素节点树:

<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:

我目前正在阅读篇关于 nodename 区分大小写的文章。不过,这与我的问题有点无关,因为我的代码未解析<![CDATA]]>,我宁愿不使用.innerHTML

您需要使用 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 会在我的字符串上附加一个关于使用 new XMLSerializer().serializeToString(xmlDoc) 的属性"xmls"。

我最终使用以下函数来创建具有区分大小写的标签名称的元素:

function createElement(tagName) {
  const doc = new DOMParser().parseFromString(`<${tagName}></${tagName}>`, 'text/xml')
  return doc.children[0]
}