【问题标题】:How to convert dataframe to xml using xml2 package?如何使用 xml2 包将数据框转换为 xml?
【发布时间】:2017-08-28 20:50:25
【问题描述】:

我正在尝试使用 xml2 使用新节点更新 xml 文件。如果我只是将所有内容手动编写为文本,这很容易,

oldXML <- read_xml("<Root><Trial><Number>3.14159 </Number><Adjective>Fast </Adjective></Trial></Root>")

但我正在开发一个应用程序,它将运行计算,然后将这些值放入 xml,所以我需要混合字符和变量。它最终看起来像:

var1 <- 4.567
var2 <- "Slow"
newLine <- read_xml(paste0("<Trial><Number>",var1," </Number><Adjective>",var2," </Adjective></Trial>"))
xml_add_child(oldXML,newLine)

我怀疑有一种比使用 paste0 更简单的方法,但我无法使用其他任何方法。我希望能够通过引用数据框来指示它更新 xml,以便它可以创建新的试验:

<Trial>
  <Number>df$number[1]</Number>
  <Adjective>df$adjective[1]</Adjective>
</Trial>
<Trial>
  <Number>df$number[2]</Number>
  <Adjective>df$adjective[2]</Adjective>
</Trial>

有什么方法可以近似地以这种方式创建新的 Trial 节点,或者至少比使用 paste0 插入变量更自然?这是 XML 包比 xml2 做得更好的东西吗?

【问题讨论】:

  • 试试rio::export(dat, "dat.xml"),看看它是否给你一个你满意的XML文件。
  • 错误:'namespace:readxl' 没有导出对象'read_xls'
  • @RichardMNIxon 通过卸载并重新安装 readxl 然后在加载 rio 之前加载它,我解决了这个错误。

标签: r xml xml2


【解决方案1】:

如果您在 data.frame 中有这样的新值:

vars <- data.frame(Number = c(4.567, 3.211),
                   Adjective = c("Slow", "Slow"),
                   stringsAsFactors = FALSE)

您可以将其转换为xml_document 的列表,如下所示:

vars_xml <- lapply(purrr::transpose(vars),
                   function(x) {
                       as_xml_document(list(Trial = lapply(x, as.list)))
                   })

然后就可以在原xml中添加新节点了:

for(trial in vars_xml) xml_add_child(oldXML, trial)

我不知道这比您的paste 方法更好。无论哪种方式,您都可以将其包装在一个函数中,这样您只需要编写一次丑陋的代码。

【讨论】:

  • 谢谢,每个节点我有不止两个值,所以这至少应该更干净。
【解决方案2】:

这是一个基于@Ista 出色答案的解决方案。基本上,我已经放弃了第一个lapply 以支持purrr::map(我们可能可以用map 替换第二个lapply,但我找不到更易读的方法来实现它)。

library(purrr)

vars_xml <- transpose(vars) %>% 
   map(~as_xml_document(list(Trial = lapply(.x, as.list))))

【讨论】:

    猜你喜欢
    • 2020-12-21
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2021-03-25
    • 1970-01-01
    • 2013-09-05
    相关资源
    最近更新 更多