You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:用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。

操作步骤:

  1. 把所有XML文件上传到Google Drive的同一个文件夹,记住文件夹ID(从文件夹的URL里就能找到,比如https://drive.google.com/drive/folders/XXXXXX里的XXXXXX)
  2. 打开你的Google Sheet,点击「扩展程序」→「Apps Script」
  3. 替换默认代码为以下脚本:
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("批量提取完成啦!");
}
  1. 保存脚本,点击运行,按照提示完成权限授权(第一次运行需要授权访问你的Drive和Sheet,放心按步骤来就行)
  2. 运行结束后,Sheet里会自动列出每个文件名和对应的逗号分隔城市名

这个脚本还加了容错处理——如果遇到格式不规范的XML,会自动用正则表达式兜底提取,避免整批任务卡壳。

内容的提问来源于stack exchange,提问作者Callum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:55:48