就在我以为我理解XPath的时候!我必须遗漏一些非常简单的东西,但我无法选择节点的值"引用计数"在下面:
xml <- "<?xml version='1.0' encoding='UTF-8'?>
<search-results xmlns='http://www.w3.org/2005/Atom' xmlns:cto='http://www.elsevier.com/xml/cto/dtd' xmlns:atom='http://www.w3.org/2005/Atom' xmlns:prism='http://prismstandard.org/namespaces/basic/2.0/' xmlns:opensearch='http://a9.com/-/spec/opensearch/1.1/' xmlns:dc='http://purl.org/dc/elements/1.1/'>
<entry>
<prism:url>http://api.elsevier.com/content/abstract/scopus_id/111111</prism:url>
<dc:title>Paper Title</dc:title>
<citedby-count>1</citedby-count>
</entry>
</search-results>"
doc <- xmlParse(xml)
我已经尝试了
doc["//citedby-count"]
和
doc["//{'citedby-count'}"]
和
doc["//entry"]
但全部返回
list()
attr(,"class")
[1] "XMLNodeSet"
然而,
doc["//dc:title"]
工作得很好。
我刚看这个太久了吗?请帮忙!
**编辑:**我认为这是因为连字符,但它不能是因为
doc["//entry"]
也不起作用。
答案 0 :(得分:1)
公共名称空间前缀声明为xmlns:foo="..."
,其中foo
是前缀,它在元素名称中显式用作<foo:bar>
其中{{1}是元素的本地名称。除此之外还有默认命名空间。它是没有像bar
这样的前缀声明的名称空间,并且在声明的默认前缀以及后代元素的元素上使用暗示,除非有什么是覆盖默认的名称空间继承,即具有本地默认名称空间或在后代元素的名称中使用显式前缀。
这是故事的第一部分,关于XML中的命名空间。另一方面,XPath不知道默认命名空间。在XPath中,没有前缀的元素在空命名空间中始终始终。要弥合XML和XPath之间关于默认命名空间的区别,通常在需要查询默认命名空间中的元素时,必须定义指向XML默认命名空间的前缀,并在XPath表达式中使用该前缀。这基本上是@hrbrmstr在第一条评论中建议的内容,如下所示(前缀可以是任何东西,只要它映射到正确的默认命名空间):
xmlns="..."
但事实证明你的XML有一个明确的前缀doc["//d:citedby-count", namespaces=c(d="http://www.w3.org/2005/Atom")]
,它已经指向同一个命名空间uri,可以直接使用。
答案 1 :(得分:0)
您也可以doc["//x:citedby-count", namespace = "x"]
来处理默认命名空间(来自xpathApply
的示例)。