wechat-map-tools/miniprogram/utils/parse.js(379 行){ points: [...], tracks: [...], errors: [...] } 才能用。
XML 用正则解析,但要同时支持成对标签和自闭合标签(第 25-33 行):
/** 扫描同名标签,支持 <tag ...>...</tag> 和 <tag ... /> */
function eachTag(xml, tag, cb) {
const re = new RegExp('<' + tag + '\\b([^>]*)>([\\s\\S]*?)</' + tag + '>|<' + tag + '\\b([^>]*)/>', 'g');
let m;
while ((m = re.exec(xml))) {
const isPair = m[1] !== undefined;
cb(attrsOf(isPair ? m[1] : (m[3] || '')), isPair ? m[2] : '');
}
}
坐标文本容错解析(第 80-119 行)——这是最能体现"面向真实用户输入"的一段:
/**
* 逐行解析,容错优先:
* 116.39,39.9 (经度在前,默认)
* 39.9 116.39 (纬度在前,自动识别)
* 天安门 116.39,39.9 (前后多余的文字当名称)
* # 开头的行跳过
* 两个值都在 ±90 内时无法自动判断(比如新疆 75.99,39.47),
* 靠 options.latFirst 决定,UI 上给个开关。
*/
实现要点:按多种分隔符切分(/[\s,,;;\t|/]+/)、
用数值范围自动判断经纬顺序、无法判断时交给 UI 开关、
非法行记进 errors 而不是抛异常。
格式识别很简单(第 59-66 行):首字符 {/[ → GeoJSON,
含 <gpx → GPX,含 <kml → KML,否则纯文本。
DOMParser,才能在 Node 里测试、在无浏览器环境运行errors 数组,合法行照常解析——永远给用户部分结果# 注释、自闭合标签、实体转义latFirst)parseAny():调用方不用管格式node tests/test-core.js)geo-tools 发布DOMParser 解析 GPX/KML(更规范,但依赖 DOM)@tmcw/togeojson 是专门做"KML/GPX → GeoJSON"的库,功能更全第 18 课(纯函数与脱离平台测试)