如何用XML解析器或regex提取XML数据生成表格?
从culverts.XML提取数据生成表格的解决方案
问题背景
需要从culverts.XML文件中提取<Placemark>节点的名称(如NODE36、NODE44),以及对应<description>标签内CDATA块中的表格数据,生成包含指定字段的汇总表格。此前尝试用正则提取<Placemark>内容时,出现回溯栈溢出和贪婪匹配范围错误(匹配第一个<Placemark>到最后一个</Placemark>)的问题。
方案一:优化正则表达式(临时解决,不推荐用于复杂XML)
正则处理XML存在局限性,但针对当前场景可通过非贪婪匹配和模式优化解决问题:
- 修正贪婪匹配:使用
.*?替代.*,确保只匹配单个<Placemark>节点内容 - 添加
(?s)修饰符,让.匹配换行符 - 明确匹配边界,减少模糊匹配带来的回溯
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")
生成的目标表格
| Name | Objectid | On_route | Road_numbe | Recommenda |
|---|---|---|---|---|
| NODE36 | 1 | Mid Turnpike | 54 | Continue to monitor. |
| NODE44 | 2 | Mid Turnpike | 54 | Not Available. |
内容的提问来源于stack exchange,提问作者M--
相关产品推荐
相关产品推荐

