求助:用Google Sheets IMPORTXML提取Overpass API XML中的城市名称
嘿,我完全懂你折腾一整天没搞定的崩溃——批量处理XML提取确实容易在细节上卡壳。针对你的需求,这里有两个靠谱的解决方向,帮你把每个XML里的城市名提取后合并成逗号分隔的内容,乖乖放进Google Sheets的单个单元格里:
方法1:优化IMPORTXML的XPath表达式(适合少量文件手动处理)
其实IMPORTXML本身能处理重复元素,只是你之前的XPath没写对。只要用正确的路径抓取所有匹配的标签值,再结合TEXTJOIN就能把数组转成逗号分隔的字符串。
假设你的XML文件的公开可访问URL存在A1单元格,直接用这个公式:
=TEXTJOIN(", ", TRUE, IMPORTXML(A1, "//node/tag[@k='name']/@v"))
公式拆解:
//node/tag[@k='name']/@v:这个XPath会精准定位所有<node>下、k属性为"name"的<tag>标签,提取它的v属性值(也就是你要的城市名)TEXTJOIN(", ", TRUE, ...):把IMPORTXML返回的城市名数组用「逗号+空格」连接,TRUE参数会自动忽略空值,避免出现多余的分隔符
⚠️ 注意:如果你的XML是本地文件,IMPORTXML没法直接读取,得先把文件上传到可公开访问的地方(比如Google Drive设为公开分享,或者其他文件托管平台)。
方法2:用Google Apps Script批量处理(适合100个文件的高效场景)
手动给100个文件填URL太折磨人,用脚本可以一次性处理所有存放在Google Drive里的XML文件,自动提取内容并写入Sheet。
操作步骤:
- 把所有XML文件上传到Google Drive的同一个文件夹,记住文件夹ID(从文件夹的URL里就能找到,比如
https://drive.google.com/drive/folders/XXXXXX里的XXXXXX) - 打开你的Google Sheet,点击「扩展程序」→「Apps Script」
- 替换默认代码为以下脚本:
function extractCityNames() { const folderId = "你的文件夹ID"; // 把这里替换成你的Drive文件夹ID const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const folder = DriveApp.getFolderById(folderId); const xmlFiles = folder.getFilesByType(MimeType.XML); let currentRow = 1; // 从Sheet的第一行开始写入数据 while (xmlFiles.hasNext()) { const file = xmlFiles.next(); const xmlContent = file.getBlob().getDataAsString(); // 用XmlService解析XML,提取目标城市名 try { const doc = XmlService.parse(xmlContent); const root = doc.getRootElement(); const cityTags = root.getChildren("node").flatMap(node => node.getChildren("tag").filter(tag => tag.getAttribute("k").getValue() === "name") ); const cityNames = cityTags.map(tag => tag.getAttribute("v").getValue()).join(", "); // 写入Sheet:A列存文件名,B列存合并后的城市名 sheet.getRange(currentRow, 1).setValue(file.getName()); sheet.getRange(currentRow, 2).setValue(cityNames); currentRow++; } catch (e) { // 如果XML解析出错(比如格式不规范),用正则表达式兜底提取 const regex = /<tag k="name" v="([^"]+)"/g; let matches; const cityNames = []; while ((matches = regex.exec(xmlContent)) !== null) { cityNames.push(matches[1]); } sheet.getRange(currentRow, 1).setValue(file.getName()); sheet.getRange(currentRow, 2).setValue(cityNames.join(", ")); currentRow++; } } SpreadsheetApp.getUi().alert("批量提取完成啦!"); }
- 保存脚本,点击运行,按照提示完成权限授权(第一次运行需要授权访问你的Drive和Sheet,放心按步骤来就行)
- 运行结束后,Sheet里会自动列出每个文件名和对应的逗号分隔城市名
这个脚本还加了容错处理——如果遇到格式不规范的XML,会自动用正则表达式兜底提取,避免整批任务卡壳。
内容的提问来源于stack exchange,提问作者Callum
相关产品推荐
相关产品推荐

