Google Sheets中用IMPORTXML XPath查询格式化XML为可读表格数据
解决方案
问题原因说明
- 之前使用
|联合查询的方式,返回的是所有匹配节点按文档顺序排列的一维数组,因此每个值单独占一行 - XPath 1.0中的
concat函数默认只对第一个匹配的节点执行拼接操作,因此只能返回单条记录
方案1(推荐,适配新版Google Sheets)
通过LET+WRAPROWS组合重塑数组结构,再拼接日期字段,公式可直接复制使用:
=ARRAYFORMULA(LET(raw_data, IMPORTXML("https://sonicstate.com/news/tools/revive_stats/client_camp_3785.xml", "//data/campaignId | //data/campaignName | //data/startDate/year | //data/startDate/month | //data/startDate/day | //data/endDate/year | //data/endDate/month | //data/endDate/day"), row_data, WRAPROWS(raw_data, 8), {INDEX(row_data,,1),INDEX(row_data,,2),INDEX(row_data,,3)&"/"&INDEX(row_data,,4)&"/"&INDEX(row_data,,5),INDEX(row_data,,6)&"/"&INDEX(row_data,,7)&"/"&INDEX(row_data,,8)}))
公式逻辑:先按顺序提取所有需要的节点值(单条记录对应8个字段:活动ID、活动名称、开始年、开始月、开始日、结束年、结束月、结束日),再把一维数组按8个值一行的规则转为二维数组,最后拼接日期字段输出四列结果,刚好匹配需求。
方案2(适配旧版Google Sheets)
如果你的Google Sheets版本不支持LET和WRAPROWS函数,可以用遍历节点下标的方式实现:
=ARRAYFORMULA(IFERROR(LET(total, COUNTA(IMPORTXML("https://sonicstate.com/news/tools/revive_stats/client_camp_3785.xml", "//data/campaignId")), idx, SEQUENCE(total), {IMPORTXML("https://sonicstate.com/news/tools/revive_stats/client_camp_3785.xml", "//data["&idx&"]/campaignId"),IMPORTXML("https://sonicstate.com/news/tools/revive_stats/client_camp_3785.xml", "//data["&idx&"]/campaignName"),IMPORTXML("https://sonicstate.com/news/tools/revive_stats/client_camp_3785.xml", "concat(//data["&idx&"]/startDate/year,'/',//data["&idx&"]/startDate/month,'/',//data["&idx&"]/startDate/day)"),IMPORTXML("https://sonicstate.com/news/tools/revive_stats/client_camp_3785.xml", "concat(//data["&idx&"]/endDate/year,'/',//data["&idx&"]/endDate/month,'/',//data["&idx&"]/endDate/day)")})))
公式逻辑:先统计总记录数,再通过序列生成每条记录的下标,逐个查询对应下标的节点内容,直接用XPath的concat拼接日期字段。
内容的提问来源于stack exchange,提问作者Nowski
相关产品推荐
相关产品推荐

