如何使用fast-xml-parser提取XML属性并修改后重建XML?
解决fast-xml-parser中XML属性提取与修改的问题
我用fast-xml-parser解析XML时,能正常提取元素,但提取属性一直失败:
import { XMLParser } from "fast-xml-parser"; let xml = '<gpx myAttr="fred"><trk>track 1</trk><trk>track 2<trkpt>trackpoint 2</trkpt></trk></gpx>'; const options = { ignoreAttributes: false, attributeNamePrefix : "@_" }; const parser = new XMLParser(options); const root = parser.parse(xml); const track0 = root.gpx.trk[0]; // 返回'track 1' const trackpoint = root.gpx.trk[1].trkpt; // 返回'trackpoint 2' const attr = root.gpx.myAttr; // 返回'undefined'
因为解析器设置了attributeNamePrefix: "@_",我试过直接写root.gpx.@_myAttr,但这会触发语法错误。我的需求是提取属性后修改它,再用XMLBuilder重新生成XML,希望能做到类似root.gpx.myAttr = "newAttr"这样的操作。
正确的属性访问方式
由于属性名带@_前缀,不能用普通的点语法访问,必须改用方括号语法:
const attr = root.gpx["@_myAttr"]; // 返回'fred'
修改属性并重新生成XML
如果想直接用带前缀的键名修改后生成XML,只需保证XMLBuilder的配置和解析器一致:
import { XMLBuilder } from "fast-xml-parser"; // 修改带前缀的属性 root.gpx["@_myAttr"] = "newAttr"; // 初始化Builder时匹配解析器的前缀规则 const builderOptions = { attributeNamePrefix: "@_", ignoreAttributes: false }; const builder = new XMLBuilder(builderOptions); const newXml = builder.build(root);
如果希望修改时不用带前缀,可以在解析和生成阶段统一去掉前缀(注意避免元素名与属性名冲突):
// 解析时配置无前缀 const parseOptions = { ignoreAttributes: false, attributeNamePrefix: "" }; const parser = new XMLParser(parseOptions); const root = parser.parse(xml); // 直接修改属性 root.gpx.myAttr = "newAttr"; // 生成时同样配置无前缀 const builder = new XMLBuilder({ attributeNamePrefix: "", ignoreAttributes: false }); const newXml = builder.build(root);
内容的提问来源于stack exchange,提问作者quilkin
相关产品推荐
相关产品推荐

