R 在节点上循环选定对象,并在第一个节点内的任何级别上选择子节点

R 在节点上循环选定对象,并在第一个节点内的任何级别上选择子节点,r,xml2,R,Xml2,我正在使用xml2包。我想: 选择具有特定标记的节点(在本例中为所有信封) 在这些节点上循环并选择其中的节点,而不考虑嵌套(在这种情况下,所有值标记都位于卡条目标记中) 用空格连接文本 共有三个信封,因此我希望能够返回三个向量,其中包含value标签中的所有文本,这些标签位于卡片输入标签中。我不能做到这一点。我怎样才能做到这一点?为什么我下面的方法不起作用 MWE 我试过的 children在内部选择器上,您希望使其相对于当前节点,因此您希望//而不是将再次搜索整个树的/ sapply(xml_

我正在使用xml2包。我想:

  • 选择具有特定标记的节点(在本例中为所有
    信封
  • 在这些节点上循环并选择其中的节点,而不考虑嵌套(在这种情况下,所有
    标记都位于
    卡条目
    标记中)
  • 用空格连接文本
  • 共有三个信封,因此我希望能够返回三个向量,其中包含
    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 "