JavaScript for循环内拼接XML字符串未达预期问题求助
问题分析
你的代码存在3个核心错误,导致最终输出和预期不符:
- 循环逻辑错误:你在for循环内部每次迭代都重新声明并赋值
xmltext变量,每一轮循环都会把上一轮拼接好的内容完全覆盖,循环结束后xmltext只会保留最后一条数据(Jerry)对应的节点内容,Tom对应的片段会直接丢失。 - 标签大小写不匹配:XML语法对标签大小写敏感,你代码中写的是小写的
<age>标签,和你预期输出里大写开头的<Age>标签不一致。 - 缩进格式不符:你当前用制表符
\t作为子节点缩进,预期输出使用2个空格作为缩进。
额外注意:标准合法的XML文件必须有且仅有一个根节点,你预期输出的内容是多个平级的<Placemark>节点,直接生成文件会是不符合规范的XML,建议在外层包裹对应的根节点,如果是后续要把这段片段嵌入其他XML文件可以忽略这个要求。
修正后的代码
const data = [{"name": "Tom", age: "20"}, {"name": "Jerry", age: "20"}] // 循环外初始化xmltext,这里先写入XML声明和根节点开头,不需要可以删除 let xmltext = '<?xml version="1.0" encoding="UTF-8"?>\n<PlacemarkList>\n'; for (let i = 0; i < data.length; i++) { // 用+=累加拼接内容,不要重新赋值变量;调整缩进为2空格,修改age标签为大写Age xmltext += ' <Placemark>\n' + ' <name>' + data[i].name + '</name>\n' + ' <Age>' + data[i].age + '</Age>\n' + ' </Placemark>\n'; } // 补全根节点闭合标签,不需要根节点可以删除 xmltext += '</PlacemarkList>'; const filename = "file.xml"; const bb = new Blob([xmltext], {type: 'text/xml'}); const downloadLink = document.getElementById('download'); downloadLink.setAttribute('href', window.URL.createObjectURL(bb)); downloadLink.setAttribute('download', filename);
如果你不需要根节点,只需要把代码里根节点相关的行删除,把xmltext初始化为空字符串即可,最终就会输出你预期的两个平级Placemark节点内容。
内容的提问来源于stack exchange,提问作者Angkasa Olrenza
相关产品推荐
相关产品推荐

