我试图在R中使用Xpath搜索html文档中的节点。 在下面的代码中,我想知道当节点丢失时如何返回NULL或NA:
library(XML)
b <- '
<bookstore specialty="novel">
<book style="autobiography">
<author>
<first-name>Joe</first-name>
<last-name>Bob</last-name>
</author>
</book>
<book style="textbook">
<author>
<first-name>Mary</first-name>
<last-name>Bob</last-name>
</author>
<author>
<first-name>Britney</first-name>
<last-name>Bob</last-name>
</author>
<price>55</price>
</book>
<book style="novel" id="myfave">
<author>
<first-name>Toni</first-name>
<last-name>Bob</last-name>
</author>
</bookstore>
'
doc2 <- htmlTreeParse(b, useInternal=T)
xpathApply(doc2, "//author/first-name", xmlValue)
例如,当我在作者上运行xpathApply()
函数时,我会得到4个结果,但如果我要删除其中一个<first-name>
个节点,我希望xpathApply
函数能够在它的位置返回一个NULL或其他东西,我不希望它跳过它。如果我要删除<first-name>Mary</first-name>
:
Joe
NA
Britney
Tony
答案 0 :(得分:5)
您可以这样做:
xpathApply(doc2, "//author",
function(x){
if("first-name" %in% names(x))
xmlValue(x[["first-name"]])
else NA})
[[1]]
[1] "Joe"
[[2]]
[1] NA
[[3]]
[1] "Britney"
[[4]]
[1] "Toni"
答案 1 :(得分:1)
替代方法:
extractFirstName <- function(node) {
val <- unlist(xpathApply(node, "first-name", xmlValue))
if (is.null(val)) { val <- NA }
val
}
xpathApply(doc2, "//author", extractFirstName)
## [[1]]
## [1] "Joe"
##
## [[2]]
## [1] NA
##
## [[3]]
## [1] "Britney"
##
## [[4]]
## [1] "Toni"