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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:18:39