R 在节点上循环选定对象,并在第一个节点内的任何级别上选择子节点
我正在使用xml2包。我想:R 在节点上循环选定对象,并在第一个节点内的任何级别上选择子节点,r,xml2,R,Xml2,我正在使用xml2包。我想: 选择具有特定标记的节点(在本例中为所有信封) 在这些节点上循环并选择其中的节点,而不考虑嵌套(在这种情况下,所有值标记都位于卡条目标记中) 用空格连接文本 共有三个信封,因此我希望能够返回三个向量,其中包含value标签中的所有文本,这些标签位于卡片输入标签中。我不能做到这一点。我怎样才能做到这一点?为什么我下面的方法不起作用 MWE 我试过的 children在内部选择器上,您希望使其相对于当前节点,因此您希望//而不是将再次搜索整个树的/ sapply(xml_
信封
)值标记都位于卡条目标记中)
value
标签中的所有文本,这些标签位于卡片输入
标签中。我不能做到这一点。我怎样才能做到这一点?为什么我下面的方法不起作用
MWE
我试过的
children在内部选择器上,您希望使其相对于当前节点,因此您希望//
而不是将再次搜索整个树的/
sapply(xml_find_all(myxml,"//envelope"), function(x)
paste(xml_text(xml_find_all(x, ".//card-entry/value")), collapse=" ")
)
# [1] "coke pizza surprise joke"
# [2] "charlie horse rug bug mario cart"
# [3] "trogdor jorb "
非常感谢。我现在明白了!
## [1] coke pizza surprise joke
## [2] charlie horse rug bug mario cart
## [3] trogdor jorb
children <- lapply(xml2::xml_find_all(myxml, '//envelope'), xml2::xml_children)
rm_na <- function(x) x[!is.na(x)]
lapply(children, function(x){
paste(rm_na(unlist(xml2::xml_text(xml2::xml_child(x, '//card-entry//value')))), collapse = ' ')
})
## [[1]]
## [1] ""
##
## [[2]]
## [1] ""
##
## [[3]]
## [1] ""
##
## There were 11 warnings (use warnings() to see them)
lapply(children, function(x){
paste(rm_na(unlist(xml2::xml_text(xml2::xml_find_all(x, '//card-entry//value')))), collapse = ' ')
})
## [[1]]
## [1] "get well coke pizza surprise joke charlie horse rug bug mario cart trogdor jorb "
##
## [[2]]
## [1] "get well coke pizza surprise joke charlie horse rug bug mario cart trogdor jorb "
##
## [[3]]
## [1] "get well coke pizza surprise joke charlie horse rug bug mario cart trogdor jorb "
sapply(xml_find_all(myxml,"//envelope"), function(x)
paste(xml_text(xml_find_all(x, ".//card-entry/value")), collapse=" ")
)
# [1] "coke pizza surprise joke"
# [2] "charlie horse rug bug mario cart"
# [3] "trogdor jorb "