从 R 列表生成 xml
Generate a xml from a R list
我是 xml 的新手并在 R 中处理它。
我已经能够使用 xml2
包从 xml 文件中读取和检索信息,但事实证明,从 R 对象创建 xml 文件更具挑战性。
特别是,我想从 R 列表生成一个 xml 文件。考虑以下示例:
library(reprex)
library(xml2)
r_list <- list(person1 = list(starts = letters[1:3], ends = letters[4:6]), person2 = list(starts = LETTERS[1:4], ends = LETTERS[5:8]))
str(r_list)
#> List of 2
#> $ person1:List of 2
#> ..$ starts: chr [1:3] "a" "b" "c"
#> ..$ ends : chr [1:3] "d" "e" "f"
#> $ person2:List of 2
#> ..$ starts: chr [1:4] "A" "B" "C" "D"
#> ..$ ends : chr [1:4] "E" "F" "G" "H"
test1 <- xml2::as_xml_document((r_list))
#> Error: Root nodes must be of length 1
new_xml <- xml_new_root(.value = "category", name = "personList")
for(person in names(r_list)){
xml_add_child(new_xml, as_xml_document(r_list[person]))
}
new_xml
#> {xml_document}
#> <category name="personList">
#> [1] <person1>ad</person1>
#> [2] <person2>AE</person2>
由 reprex package (v2.0.1)
于 2021-11-25 创建
我尝试使用 as_xml_document
函数直接将列表强制转换为 xml,但出现错误 Root nodes must be of length 1
.
按照上的想法,我尝试创建xml文档,其中包含一个根节点和xml_add_child()
到这个文档,但我没有得到预期的结果(见代码输出)。在那个问题中,他们从 R 数据框而不是列表转换。
我还想拥有个性化的标签名称并为这些标签添加属性。希望的输出是:
<category name="personList">
<pers name="person1">
<starts>
<value>a</value>
<value>b</value>
<value>c</value>
</starts>
<ends>
<value>d</value>
<value>e</value>
<value>f</value>
</ends>
</pers>
<pers name="person2">
<starts>
<value>A</value>
<value>B</value>
<value>C</value>
<value>D</value>
</starts>
<ends>
<value>D</value>
<value>E</value>
<value>F</value>
<value>G</value>
</ends>
</pers>
</category>
感谢您的帮助,祝您有愉快的一天
R 列表属性可以映射到 XML 个属性:
library(xml2)
library(tidyverse)
r_list <- list(person1 = list(starts = letters[1:3], ends = letters[4:6]), person2 = list(starts = LETTERS[1:4], ends = LETTERS[5:8]))
r_list
new_xml <- xml_new_root(.value = "category", name = "personList")
for (person in names(r_list)) {
p <- list()
p[["pers"]] <- list(
starts = r_list[[person]]$starts %>% map(~list(value = list(.x))),
ends = r_list[[person]]$ends %>% map(~list(value = list(.x)))
)
attr(p[["pers"]], "name") <- person
xml_add_child(new_xml, as_xml_document(p))
}
write_xml(new_xml, "foo.xml")
输出:
<?xml version="1.0" encoding="UTF-8"?>
<category name="personList">
<pers name="person1">
<starts>
<value>a</value>
<value>b</value>
<value>c</value>
</starts>
<ends>
<value>d</value>
<value>e</value>
<value>f</value>
</ends>
</pers>
<pers name="person2">
<starts>
<value>A</value>
<value>B</value>
<value>C</value>
<value>D</value>
</starts>
<ends>
<value>E</value>
<value>F</value>
<value>G</value>
<value>H</value>
</ends>
</pers>
</category>
根据@Limey 的评论(参见this question),我可以使用以下代码生成所需的输出(作为答案发布只是为了完整性,因为@danlooo 答案也产生相同的输出)。
library(XML)
r_list <- list(person1 = list(starts = letters[1:3], ends = letters[4:6]), person2 = list(starts = LETTERS[1:4], ends = LETTERS[5:8]))
str(r_list)
category = newXMLNode("category", attrs = c(name="personList"))
for(person in names(r_list)){
pers <- newXMLNode("pers", attrs = c(name = person), parent = category)
startsn <- newXMLNode("starts", parent = pers)
for(value in seq_along(r_list[[person]][["starts"]])){
svalue <- newXMLNode("value", r_list[[person]][["starts"]][[value]], parent = startsn)
}
endsn <- newXMLNode("ends", parent = pers)
for(value in seq_along(r_list[[person]][["ends"]])){
evalue <- newXMLNode("value", r_list[[person]][["ends"]][[value]], parent = endsn)
}
}
category
我是 xml 的新手并在 R 中处理它。
我已经能够使用 xml2
包从 xml 文件中读取和检索信息,但事实证明,从 R 对象创建 xml 文件更具挑战性。
特别是,我想从 R 列表生成一个 xml 文件。考虑以下示例:
library(reprex)
library(xml2)
r_list <- list(person1 = list(starts = letters[1:3], ends = letters[4:6]), person2 = list(starts = LETTERS[1:4], ends = LETTERS[5:8]))
str(r_list)
#> List of 2
#> $ person1:List of 2
#> ..$ starts: chr [1:3] "a" "b" "c"
#> ..$ ends : chr [1:3] "d" "e" "f"
#> $ person2:List of 2
#> ..$ starts: chr [1:4] "A" "B" "C" "D"
#> ..$ ends : chr [1:4] "E" "F" "G" "H"
test1 <- xml2::as_xml_document((r_list))
#> Error: Root nodes must be of length 1
new_xml <- xml_new_root(.value = "category", name = "personList")
for(person in names(r_list)){
xml_add_child(new_xml, as_xml_document(r_list[person]))
}
new_xml
#> {xml_document}
#> <category name="personList">
#> [1] <person1>ad</person1>
#> [2] <person2>AE</person2>
由 reprex package (v2.0.1)
于 2021-11-25 创建我尝试使用 as_xml_document
函数直接将列表强制转换为 xml,但出现错误 Root nodes must be of length 1
.
按照xml_add_child()
到这个文档,但我没有得到预期的结果(见代码输出)。在那个问题中,他们从 R 数据框而不是列表转换。
我还想拥有个性化的标签名称并为这些标签添加属性。希望的输出是:
<category name="personList">
<pers name="person1">
<starts>
<value>a</value>
<value>b</value>
<value>c</value>
</starts>
<ends>
<value>d</value>
<value>e</value>
<value>f</value>
</ends>
</pers>
<pers name="person2">
<starts>
<value>A</value>
<value>B</value>
<value>C</value>
<value>D</value>
</starts>
<ends>
<value>D</value>
<value>E</value>
<value>F</value>
<value>G</value>
</ends>
</pers>
</category>
感谢您的帮助,祝您有愉快的一天
R 列表属性可以映射到 XML 个属性:
library(xml2)
library(tidyverse)
r_list <- list(person1 = list(starts = letters[1:3], ends = letters[4:6]), person2 = list(starts = LETTERS[1:4], ends = LETTERS[5:8]))
r_list
new_xml <- xml_new_root(.value = "category", name = "personList")
for (person in names(r_list)) {
p <- list()
p[["pers"]] <- list(
starts = r_list[[person]]$starts %>% map(~list(value = list(.x))),
ends = r_list[[person]]$ends %>% map(~list(value = list(.x)))
)
attr(p[["pers"]], "name") <- person
xml_add_child(new_xml, as_xml_document(p))
}
write_xml(new_xml, "foo.xml")
输出:
<?xml version="1.0" encoding="UTF-8"?>
<category name="personList">
<pers name="person1">
<starts>
<value>a</value>
<value>b</value>
<value>c</value>
</starts>
<ends>
<value>d</value>
<value>e</value>
<value>f</value>
</ends>
</pers>
<pers name="person2">
<starts>
<value>A</value>
<value>B</value>
<value>C</value>
<value>D</value>
</starts>
<ends>
<value>E</value>
<value>F</value>
<value>G</value>
<value>H</value>
</ends>
</pers>
</category>
根据@Limey 的评论(参见this question),我可以使用以下代码生成所需的输出(作为答案发布只是为了完整性,因为@danlooo 答案也产生相同的输出)。
library(XML)
r_list <- list(person1 = list(starts = letters[1:3], ends = letters[4:6]), person2 = list(starts = LETTERS[1:4], ends = LETTERS[5:8]))
str(r_list)
category = newXMLNode("category", attrs = c(name="personList"))
for(person in names(r_list)){
pers <- newXMLNode("pers", attrs = c(name = person), parent = category)
startsn <- newXMLNode("starts", parent = pers)
for(value in seq_along(r_list[[person]][["starts"]])){
svalue <- newXMLNode("value", r_list[[person]][["starts"]][[value]], parent = startsn)
}
endsn <- newXMLNode("ends", parent = pers)
for(value in seq_along(r_list[[person]][["ends"]])){
evalue <- newXMLNode("value", r_list[[person]][["ends"]][[value]], parent = endsn)
}
}
category