在R中解析具有相同名称的特定XML元素

时间:2017-04-25 17:33:46

标签: r xml

我使用R中的xml包来解析XML文档(下面的代码段)。

xml片段:

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

我想选择System:Mighty部分,如果可能的话,甚至只选择Mighty部分。到目前为止我的代码:

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

排除置信度级元素的正确方法是什么?在此先感谢!!

1 个答案:

答案 0 :(得分: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"

你可以在xml_find_all中使用更强大的XPath做更多事情,但这种方法很容易编写和阅读。如果这实际上是HTML,你可以使用rvest而不是xml2;两者都很好。