如何从XML文档的DOM对象中获取XML声明信息?
如何从XML文档的DOM对象中获取XML声明信息?
嘿,这个问题我之前也踩过坑!你说得完全没错,XML声明确实不是DOM树里的节点——它属于文档的元数据范畴,不会被解析成常规的DOM节点,所以你在childNodes里找不到它太正常了。不过别担心,DOM其实悄悄把这些信息存在了Document对象的专属属性里,XMLSerializer就是靠这些属性生成声明的。
怎么拿到XML声明的具体信息?
Document对象自带两个直接属性可以获取这些值:
xmlVersion:对应XML声明里的version字段,比如你例子里的1.0xmlStandalone:布尔值,对应standalone字段,true对应yes,false对应no
你可以直接用这两个属性手动拼接出标准的XML声明:
const declaration = `<?xml version='${dom.xmlVersion}' standalone='${dom.xmlStandalone ? 'yes' : 'no'}'?>`;
聊聊serializeToString()是怎么做到的
它根本不需要从DOM节点里找声明,而是直接读取Document的xmlVersion和xmlStandalone属性,然后按照XML规范生成对应的声明字符串。哪怕原XML里没写声明,它也会用默认值(version="1.0",standalone="no")自动生成,这完全符合XML的标准要求。
修改你的序列化函数
你只需要在处理DOCUMENT_NODE类型的节点时,先把XML声明加上就行。修改后的代码片段如下:
if (node.nodeType === Node.DOCUMENT_NODE) { // 先添加XML声明 string += `<?xml version='${node.xmlVersion}' standalone='${node.xmlStandalone ? 'yes' : 'no'}'?>`; // 再处理文档的子节点 for (const child of node.childNodes) { recursive(child); } }
把这段替换你原来的DOCUMENT_NODE处理逻辑,再跑你的测试例子,输出就会和serializeToString()的结果完全一致了!
备注:内容来源于stack exchange,提问作者slartibartfast
相关产品推荐
相关产品推荐

