R中的XPath:如果缺少节点,则返回NA

jmi*_*738 5 xpath r

我正在尝试使用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)
Run Code Online (Sandbox Code Playgroud)

例如,当我xpathApply()在author上运行该函数时,我会得到4个结果,但是如果要删除其中一个<first-name>节点,我希望该xpathApply函数返回NULL或其他代替它的位置,那么我就不希望它跳过它。如果要删除,我希望结果看起来像这样<first-name>Mary</first-name>

Joe
NA
Britney
Tony
Run Code Online (Sandbox Code Playgroud)

ags*_*udy 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"
Run Code Online (Sandbox Code Playgroud)