R语言中XML转JSON问题解决:修复重复键与缺失根节点
解决XML转JSON时重复键与根节点缺失的问题
我来帮你搞定这个XML转JSON的问题!你遇到的重复book键和缺失bookstore根节点的情况,其实是XML::xmlToList()和rjson::toJSON()的默认行为导致的——XML允许同级同名节点,但JSON不支持重复键,而且默认的列表转换会丢失根节点信息。下面给你两种可行的解决方案:
方案一:用xml2+jsonlite(推荐,更简洁规范)
这两个包的组合对XML转JSON的处理更贴合标准,能自动处理同名节点为数组,还会保留根节点和正确的属性/文本格式,完全符合你的理想输出:
rm(list = ls()) library(xml2) library(jsonlite) # 读取XML文件(记得替换成你的实际文件路径,要带.xml后缀哦) xml_doc <- read_xml("path/book.xml") # 直接转换为格式化后的JSON json_result <- toJSON(xml_doc, pretty = TRUE) # 输出结果 cat(json_result)
运行这段代码后,你会得到和理想格式几乎完全一致的JSON:根节点bookstore被保留,多个book自动转为数组,属性前缀为-,文本内容用#text标记,完美解决你的问题。
方案二:基于原有的XML+rjson包手动调整结构
如果你一定要用原来的包组合,可以通过手动调整列表结构来修正问题:
rm(list = ls()) library(XML) library(rjson) # 解析XML文件 xml_parse <- xmlParse(file = "path/book.xml") xml_root <- xmlRoot(xml_parse) # 提取所有book节点,逐个转为列表 book_nodes <- xmlChildren(xml_root) book_list <- lapply(book_nodes, function(node) { xmlToList(node, addAttributes = TRUE, simplify = FALSE) }) # 构建正确的嵌套结构:包裹根节点bookstore,把book列表转为数组 xml_list <- list(bookstore = list(book = book_list)) # 转换为JSON并输出 xml_rjson <- toJSON(xml_list) cat(xml_rjson)
为什么这个方法有效?
- 我们先提取根节点下的所有
book子节点,避免xmlToList()直接处理根节点时丢失同名节点的数组结构; - 手动把多个
book列表放到一个数组(即列表的列表)中,这样toJSON()会把它识别为JSON数组,不会出现重复键; - 最后用
list(bookstore = ...)包裹住整个结构,保留了根节点名称。
小提示
rjson包的维护不如jsonlite活跃,jsonlite在处理JSON的标准兼容性、结构合理性上表现更好,所以更推荐方案一哦。
内容的提问来源于stack exchange,提问作者SAINO
相关产品推荐
相关产品推荐

