XML R如何检索值(这可能是命名空间问题吗?)

时间:2015-12-02 18:06:24

标签: xml r xpath

就在我以为我理解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"] 

也不起作用。

2 个答案:

答案 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的示例)。