以编程方式向XML文档添加XML声明

4

我想在Javascript中生成的XML文档中添加声明,但是我没有找到足够的文档。

假设我想通过编程方式(使用Javascript)创建以下XML文档:

<?xml version="1.0" encoding="UTF-8"?>
<people>
  <person first-name="eric" last-name="jung" />
</people>

这是我的代码:

let doc = document.implementation.createDocument("", "", null);
let peopleElem = doc.createElement("people");

let personElem = doc.createElement("person");
personElem.setAttribute("first-name", "eric");
personElem.setAttribute("last-name", "jung");

peopleElem.appendChild(personElem);
doc.appendChild(peopleElem);

let docStr = new XMLSerializer().serializeToString(doc.documentElement);
console.log(docStr);

// produces:
// <people>
//   <person first-name="eric" last-name="jung" />
// </people>

// and not:
// <?xml version="1.0" encoding="UTF-8"?>
// <people>
//   <person first-name="eric" last-name="jung" />
// </people>

我该如何在生成的XML中获取<?xml version="1.0" encoding="UTF-8"?>呢?
注意:我知道在这种情况下添加声明是无用的,但最终我想要使用特定的命名空间并向我的文档添加自定义XML实体。
谢谢您的帮助。

如果您序列化整个“doc”节点而不仅仅是其根元素/documentElement节点,您会得到一个XMLSerializer的XML序列化吗? 我认为DOM API不会将XML声明视为节点,它是在序列化期间添加的内容,但我不确定浏览器端API在控制此方面时是否非常灵活。 - Martin Honnen
1
至于“自定义”实体,DOM API 对此也不是非常灵活和强大,但 createDocument 曾允许传递 DTD/doctype 参数。 - Martin Honnen
似乎即使序列化整个文档也不会输出XML声明,主要是因为serializeToString不需要它。不确定是否存在更低级别的API可以将其序列化到流或文件中,在那里需要设置/确保特定编码的能力。 - Martin Honnen
你会建议我使用这个库(https://github.com/nashwaan/xml-js)来解决我的问题吗?(例如添加声明,添加自定义实体等等...) - JacopoStanchi
看起来我仍然可以通过编程方式为我的 XML 实体添加 CDATA 标记。但是,我仍然有一些问题:我还需要在我的 XML 文档开头包含一个 <?xml-model ...?> 标记。是否有一种简洁的方法来实现这个? - JacopoStanchi
1
这是一个处理指令,DOM(核心/XML)API应该支持,除非HTML5/DOM4的开发人员已经削弱了浏览器API以不再支持它们。 - Martin Honnen
1个回答

7

以下是一种实现方法。

请查看XMLSerializer兼容节点类型列表

可以使用createProcessingInstruction方法创建ProcessingInstruction节点。

最后,需要序列化整个文档,而不仅仅是documentElement

const doc = document.implementation.createDocument("", "", null);
const peopleElem = doc.createElement("people");

const pi = doc.createProcessingInstruction('xml', 'version="1.0" encoding="UTF-8"');
doc.insertBefore(pi, doc.firstChild);

const personElem = doc.createElement("person");

personElem.setAttribute("first-name", "eric");
personElem.setAttribute("last-name", "jung");

peopleElem.appendChild(personElem);

doc.appendChild(peopleElem);

const docStr = new XMLSerializer().serializeToString(doc);

console.log(docStr);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接