2017-04-25 75 views
0

我在R中使用xml包来解析XML文档(下面的代码片段)。在R中解析具有相同名称的特定XML元素

XML片段:

<notes> 
    <body xml="http://www.books.xhtml"> 
     <p> System: Mighty</p> 
     <p>Confidence Level: </p> 
    </body> 
    </notes> 

我想只要选择系统:强大部分,甚至只是全能的一部分,如果可能的。我的代码到目前为止:

data <- xmlParse("abc.xml") 
out_p <- getNodeSet(data, "//*[name()='p']", fun=xmlToList) 

这会导致所有p元素的长列表。系统和信心水平包括在内。我试图玩弄编辑我的代码只选择系统的元素,都没有成功:

out_p <- getNodeSet(data, "//*p[attribute()[contains.,"SYSTEM"]", fun=xmlToList) ## doesn't work 

什么是排除信誉度元素的正确方法是什么?提前致谢!!

回答

0

使用XML2:

library(xml2) 
library(magrittr) 

xml <- ' <notes> 
    <body xml="http://www.books.xhtml"> 
     <p> System: Mighty</p> 
     <p>Confidence Level: </p> 
    </body> 
    </notes>' 

xml %>% read_xml() %>% 
    xml_find_all('//p') %>% # select p elements 
    xml_text() %>% # get node text 
    grep('System:', ., value = TRUE) %>% # select only matching text 
    sub(' System: ', '', .) # clean text 
#> [1] "Mighty" 

你可以做一些更激烈的XPath做多xml_find_all,但这种方法容易编写和阅读。如果这实际上是HTML,则可以使用rvest而不是xml2;两者都很好。

相关问题