如何使用 xml2 包将数据帧转换为 xml?
How to convert dataframe to xml using xml2 package?
我正在尝试使用 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>
有没有什么方法可以大致以这种方式创建新的试验节点,或者至少比使用 paste0 插入变量更自然?这是 XML 包比 xml2 更好的地方吗?
如果您在 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
方法更好。无论哪种方式,您都可以将其包装在一个函数中,这样您只需编写一次丑陋的代码。
这是一个基于@Ista 的出色回答的解决方案。基本上,我放弃了第一个 lapply
以支持 purrr::map
(我们可以用 map
替换第二个 lapply
,但我找不到更具可读性的实现该目标的方法)。
library(purrr)
vars_xml <- transpose(vars) %>%
map(~as_xml_document(list(Trial = lapply(.x, as.list))))
我正在尝试使用 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>
有没有什么方法可以大致以这种方式创建新的试验节点,或者至少比使用 paste0 插入变量更自然?这是 XML 包比 xml2 更好的地方吗?
如果您在 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
方法更好。无论哪种方式,您都可以将其包装在一个函数中,这样您只需编写一次丑陋的代码。
这是一个基于@Ista 的出色回答的解决方案。基本上,我放弃了第一个 lapply
以支持 purrr::map
(我们可以用 map
替换第二个 lapply
,但我找不到更具可读性的实现该目标的方法)。
library(purrr)
vars_xml <- transpose(vars) %>%
map(~as_xml_document(list(Trial = lapply(.x, as.list))))