在R中解析具有相同名称的特定XML元素
问题描述:
我在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
什么是排除信誉度元素的正确方法是什么?提前致谢!!
答
使用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;两者都很好。