Node.js使用xmlbuilder2创建XML时Listings节点自闭合问题
问题根因
<Listings>被渲染为自闭合标签、子节点未正确嵌套的核心原因是节点操作指针错误:
- 你执行
xml.ele('Listings')创建Listings节点后,没有保存该节点的返回引用,后续操作始终停留在根节点ListingDataFeed层级 - 循环内调用
xml.ele('Listing')是直接在根节点下创建Listing子节点,和空的Listings节点完全平级 - 循环后直接写
.up()属于无效语法:for循环语句没有返回值,根本无法触发链式调用闭合Listings节点 - 没有任何子节点的Listings节点,最终序列化时就会被输出为自闭合标签
<Listings/>
修复代码
取消你注释掉的Listings节点引用代码,循环内所有新增Listing的操作都基于Listings节点实例执行即可,不需要在循环后额外调用up()方法:
var xml = builder.create('ListingDataFeed', { version: '1.0', encoding: "UTF-8"}); // 持有Listings节点引用,创建后操作指针自动停在Listings节点 var listings = xml.ele('Listings'); for(var i = 0; i < result.length; i++){ // 基于listings节点添加Listing子节点,保证嵌套关系正确 listings.ele('Listing') .ele('ListingID', `${result[i].sku}`).up() .ele('Title').dat(`${result[i].name}`).up() .ele('TransactionType', `${transaction}`).up() .ele('PublicationType', `${type_offer}`).up() .ele('DetailViewUrl', 'https://sortinvestimentos.com.br/imovel/' + `${result[i].url}`).up() .ele('Media') .ele('Item', {'medium': 'image'}, `${result[i].media_1}`).up() .up() // 闭合Media节点 .ele('ContactInfo') .ele('Name', 'Sort Investimentos').up() .ele('Email', 'contato@sortinvestimentos.com.br').up() .up() // 闭合ContactInfo节点 .up() // 闭合当前Listing节点 } var root = xml.end({ pretty: true });
逻辑说明
xmlbuilder的链式调用规则是:调用ele()创建子节点后,返回值是新建的子节点实例,操作指针会移动到该子节点上,调用up()才会将指针移回父节点。只要始终持有正确的父节点实例、基于对应实例添加子元素,就不会出现节点错位、空节点自闭合的问题。
内容的提问来源于stack exchange,提问作者Carlos Eduardo
相关产品推荐
相关产品推荐

