解析 XML 文件的基本方法
在 R 中解析 XML 文件通常使用 XML 或 xml2 包。以下是使用 xml2 包的示例代码:
library(xml2)
xml_data <- read_xml("example.xml")
root_node <- xml_root(xml_data)
读取节点和属性
使用 xml_find_all 和 xml_attrs 可以提取节点和属性信息:
nodes <- xml_find_all(xml_data, "//book")
first_node_attrs <- xml_attrs(nodes[[1]])
提取节点文本内容
获取节点内的文本内容可以使用 xml_text 函数:
titles <- xml_text(xml_find_all(xml_data, "//title"))
修改 XML 内容
通过 xml_add_child 和 xml_set_attr 可以修改 XML 结构:
new_node <- xml_add_child(root_node, "newElement")
xml_set_attr(new_node, "attribute", "value")
写入 XML 文件
将修改后的 XML 写入新文件:
write_xml(xml_data, "modified.xml")
处理命名空间
处理带有命名空间的 XML 需要特殊处理:
ns <- xml_ns(xml_data)
special_nodes <- xml_find_all(xml_data, "//d1:specialNode", ns)
使用 XPath 查询
XPath 提供了强大的查询能力:
results <- xml_find_all(xml_data, "//book[price>10]/title")
转换 XML 为数据框
将 XML 数据转换为数据框便于分析:
library(purrr)
books <- map_df(xml_find_all(xml_data, "//book"), function(node) {
data.frame(
title = xml_text(xml_find_first(node, "title")),
price = as.numeric(xml_text(xml_find_first(node, "price")))
)
})
处理大型 XML 文件
对于大型文件,使用流式处理更高效:
library(xml2)
stream <- xml_event_read("large_file.xml")
while (!is.null(event <- stream())) {
# 处理每个事件
}
验证 XML 结构
验证 XML 是否符合某种模式:
schema <- read_xml("schema.xsd")
valid <- xml_validate(xml_data, schema)
处理 CDATA 部分
提取 CDATA 内容需要特殊处理:
cdata_nodes <- xml_find_all(xml_data, "//script")
cdata_content <- xml_text(cdata_nodes)
处理 XML 注释
提取或操作 XML 中的注释:
comments <- xml_find_all(xml_data, "//comment()")
comment_text <- xml_text(comments)
创建新的 XML 文档
从头创建 XML 文档:
new_doc <- xml_new_document()
root <- xml_add_child(new_doc, "root")
xml_add_child(root, "child", "Content")
处理特殊字符
确保特殊字符被正确转义:
node <- xml_add_child(root, "special")
xml_text(node) <- "This & That"
性能优化技巧
对于大型 XML 处理,考虑这些优化:
# 使用 xpath2 替代 xpath1
fast_results <- xml_find_all(xml_data, "//*[local-name()='item']")
错误处理机制
健壮的 XML 处理需要错误处理:
tryCatch({
xml_data <- read_xml("corrupt.xml")
}, error = function(e) {
message("XML parsing failed: ", e$message)
})



