如何使用 xml-fast-parser 提取属性

问题描述 投票:0回答:1

我可以像这样从解析的 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];           // gives 'track 1'
const trackpoint = root.gpx.trk[1].trkpt; // gives 'trackpoint 2'
const attr = root.gpx.myAttr;             // gives 'undefined'

但是尝试获取该属性不起作用。由于解析器的

attributeNamePrefix
我也尝试过

 const attr = root.gpx.@_myAttr;

但是这当然会产生语法错误。提取属性后,我想修改它并使用

XMLBuilder
重新创建 XML,因此我需要类似

的内容
root.gpx.myAttr = "newAttr";

这里有一个JSFiddle

javascript xml-parsing
1个回答
0
投票

您放入 JSFiddle 的代码似乎大部分是正确的。但是,XML 字符串中存在语法错误;缺少

<trk>
的结束标签。这是更正后的代码:

更正 JSFiddle:

// let xml = '<gpx myAttr="fred"><trk>track 1</trk><trk>track 2<trkpt>trackpoint 2</trkpt></trk></gpx>';
let xml =
  '<gpx myAttr="fred"><trk>track 1</trk><trk>track 2</trk><trkpt>trackpoint 2</trkpt></trk></gpx>';
const options = {
  ignoreAttributes: false,
  attributeNamePrefix: '@_', // you have assign this so use this to access the attribute
};
const parser = new XMLParser(options);
const root = parser.parse(xml);

const track0 = root.gpx.trk[0];
const trackpoint = root.gpx.trk[1].trkpt;
// const attr = root.gpx.myAttr
const attr = root.gpx['@_myAttr']; // Use the correct attribute name

document.getElementById('trk1').innerHTML = track0;
document.getElementById('trk2').innerHTML = trackpoint;
document.getElementById('attr').innerHTML = attr;

所做的更改:

  1. 更正了 xml 字符串中缺少的结束标记。
  2. 使用
    root.gpx['@_myAttr']
    而不是
    root.gpx.myAttr
    来访问具有正确名称的属性。
© www.soinside.com 2019 - 2024. All rights reserved.