【问题标题】:Add XML declaration to XML document programmatically以编程方式将 XML 声明添加到 XML 文档
【发布时间】:2021-08-16 10:09:29
【问题描述】:

我想将声明添加到用 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 中获取&lt;?xml version="1.0" encoding="UTF-8"?&gt;

注意:我知道在这种情况下添加声明是没有用的,但最终我想使用特定的命名空间并将自定义 XML 实体添加到我的文档中。

感谢您的帮助。

【问题讨论】:

  • 如果您序列化整个doc 节点而不仅仅是它的根元素/documentElement 节点,难道您不会使用XMLSerializer 获得XML 序列化吗?我不认为 DOM API 将 XML 声明视为一个节点,它是在序列化过程中添加的东西,但我不确定浏览器端 API 在控制这一点方面是否非常灵活。
  • 对于“自定义”实体,DOM API 也不是非常灵活和强大,但 createDocument 曾经允许传入 DTD/doctype 参数。
  • 似乎即使序列化整个文档也不会输出 XML 声明,主要是因为 serializeToString 不需要。不确定是否存在更多用于序列化到流或文件的低级 API,其中需要设置/确保特定编码的能力。
  • 您是否建议使用诸如this one 之类的库来解决我的问题? (添加声明,添加自定义实体,...)
  • 这是 DOM(核心/XML)API 应该支持的处理指令,除非 HTML5 人/DOM4 人已经残废的浏览器 API 不再支持它们。

标签: javascript xml xml-declaration


【解决方案1】:

这是一种方法。

请参阅list of compatible node types for XMLSerializer

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

最后,您需要序列化整个文档,而不仅仅是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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2013-05-03
    • 2017-01-17
    • 2011-05-10
    相关资源
    最近更新 更多