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

如何用XML解析器或regex提取XML数据生成表格?

从culverts.XML提取数据生成表格的解决方案

问题背景

需要从culverts.XML文件中提取<Placemark>节点的名称(如NODE36、NODE44),以及对应<description>标签内CDATA块中的表格数据,生成包含指定字段的汇总表格。此前尝试用正则提取<Placemark>内容时,出现回溯栈溢出和贪婪匹配范围错误(匹配第一个<Placemark>到最后一个</Placemark>)的问题。


方案一:优化正则表达式(临时解决,不推荐用于复杂XML)

正则处理XML存在局限性,但针对当前场景可通过非贪婪匹配和模式优化解决问题:

  1. 修正贪婪匹配:使用.*?替代.*,确保只匹配单个<Placemark>节点内容
  2. 添加(?s)修饰符,让.匹配换行符
  3. 明确匹配边界,减少模糊匹配带来的回溯

R代码示例

library(stringr)

# 读取XML文件内容
file_str <- readLines("culverts.XML", warn = FALSE) |> paste(collapse = "\n")

# 提取单个Placemark节点内容(非贪婪匹配)
placemarks <- str_extract_all(file_str, "(?s)<Placemark>(.*?)</Placemark>")[[1]]

# 遍历每个Placemark提取数据
result_list <- lapply(placemarks, function(pm) {
  # 提取节点名称
  name <- str_extract(pm, "<name>(.*?)</name>") |> str_remove_all("<name>|</name>")
  
  # 提取CDATA内的表格内容
  cdata_content <- str_extract(pm, "<!\\[CDATA\\[(.*?)\\]\\]>") |> 
    str_remove_all("<!\\[CDATA\\[|\\]\\]>|^<br>|<br>$")
  
  # 解析HTML表格为数据框
  tbl <- readHTMLTable(cdata_content, stringsAsFactors = FALSE)[[1]]
  colnames(tbl) <- tbl[,1]
  tbl <- t(tbl[,-1]) |> as.data.frame(stringsAsFactors = FALSE)
  rownames(tbl) <- NULL
  
  # 合并名称与表格数据
  cbind(Name = name, tbl)
})

# 合并为最终数据框
final_tbl <- do.call(rbind, result_list)
print(final_tbl)

方案二:使用XML解析器(推荐,稳定可靠)

处理XML文件最稳妥的方式是使用专业解析库,比如R中的xml2包,它能正确处理节点嵌套、CDATA等XML结构,彻底避免正则的各类问题。

R代码示例

library(xml2)
library(rvest)

# 读取XML文件
doc <- read_xml("culverts.XML")

# 提取所有Placemark节点
placemark_nodes <- xml_find_all(doc, "//Placemark")

# 遍历节点提取数据
final_tbl <- lapply(placemark_nodes, function(node) {
  # 提取节点名称
  name <- xml_text(xml_find_first(node, "./name"))
  
  # 提取CDATA文本并解析表格
  cdata_text <- xml_text(xml_find_first(node, "./description"))
  tbl <- read_html(cdata_text) |> html_table(header = TRUE)[[1]]
  
  # 合并名称与表格数据
  cbind(Name = name, tbl)
}) |> do.call(rbind, _)

# 输出格式化表格
knitr::kable(final_tbl, align = "c")

生成的目标表格

NameObjectidOn_routeRoad_numbeRecommenda
NODE361Mid Turnpike54Continue to monitor.
NODE442Mid Turnpike54Not Available.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:35:01