我有一个嵌套的 xml 数据集,如下所示,我正在尝试使用xml2和tidyverse包进行解析。有三个儿童信封。我想获取每个标签中的子标签和子标签的所有文本,<card-id>
并使用易于识别的分隔符将它们折叠起来,或者从中制作一个 data.frames 列表。<value>
<envelope>
;;;
MWE:这是数据:
library(xml2)
library(tidyverse)
myxml <- read_xml('
<inside>
<envelope>
<card-entry>
<card-id type="integer">605380</card-id>
<value>coke</value>
<random></random>
</card-entry>
<card-entry>
<card-id type="integer">610954</card-id>
<value>pizza</value>
<random>false</random>
</card-entry>
<card-entry>
<card-id type="integer">605381</card-id>
<value>surprise</value>
</card-entry>
<card-entry>
<card-id type="integer">610958</card-id>
<value>joke</value>
<random>true</random>
</card-entry>
</envelope>
<envelope>
<card-entry>
<card-id type="integer">605381</card-id>
<value>charlie horse</value>
</card-entry>
<card-entry>
<card-id type="integer">605380</card-id>
<value>rug bug</value>
</card-entry>
<card-entry>
<card-id type="integer">610954</card-id>
<value>mario cart</value>
</card-entry>
</envelope>
<envelope>
<card-entry>
<card-id type="integer">605377</card-id>
<value>trogdor</value>
</card-entry>
<card-entry>
<card-id type="integer"></card-id>
<value>jorb</value>
</card-entry>
<card-entry>
<card-id type="integer">605333</card-id>
<value></value>
</card-entry>
</envelope>
</inside>
'
)
期望的输出:
c(
"605380;;;coke;;;610954;;;pizza;;;605381;;;surprise;;;610958;;;joke",
"605381;;;charlie horse;;;605380;;;rug bug;;;610954;;;mario cart",
"605377;;;trogdor;;;;;;jorb;;;605333;;;"
)
或者像这样的嵌套列表一样好(也许更好):
[[1]]
card_id value
1 605380 coke
2 610954 pizza
3 605381 surprise
4 610958 joke
[[2]]
card_id value
1 605381 charlie horse
2 605380 rug bug
3 610954 mario cart
[[3]]
card_id value
1 605377 trogdor
2 <NA> jorb
3 605333 <NA>
我想我可以as_list
在孩子身上使用,然后xml_find_all
用来创建一个 data.frames 列表,但是as_list
+lapply
不只攻击一个envelope
,而是在每次通过时都会攻击它们(我很高兴知道我错过了什么这个功能也是)。
我试过的
myxml %>%
xml_find_all('//envelope') %>%
as_list() %>%
lapply(function(x){
data_frame(
card_id = x %>% xml_find_all('//card-id') %>% xml_text(),
value = x %>% xml_find_all('//value') %>% xml_text()
)
})