1

我有以下两个最小的 XML 文件

历史1.xml

<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.8/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.8/ http://www.mediawiki.org/xml/export-0.8.xsd" version="0.8" xml:lang="en">
    <page>
        <title>AccessibleComputing</title>
    </page>
    <page>
        <title>History</title>
    </page>
</mediawiki>

历史2.xml

<mediawiki>
    <page>
        <title>AccessibleComputing</title>
    </page>
    <page>
        <title>History</title>
    </page>
</mediawiki>

请注意,唯一的区别是“mediawiki”节点中的所有属性。我正在尝试使用 R 获取所有页面标题。现在我输入

library("XML")

doc = xmlParse('history1.xml',useInternalNodes=TRUE)

titles<-xpathSApply(doc,'//page/title',xmlValue)

并得到一个空列表作为输出

list()

如果我改用第二个 XML 文件:

library("XML")

doc = xmlParse('history2.xml',useInternalNodes=TRUE)

titles<-xpathSApply(doc,'//page/title',xmlValue)

我得到了我想要的,即

[1] "AccessibleComputing" "History"

问题是:我正在从 Wikipedia 下载这些列表,但我不能总是手动删除这些属性。所以我的问题是:

1)为什么第二个文件有效而第一个文件无效?

2)有没有办法解决这个问题?

3)如果答案是否定的:我可以自动删除 R 中的属性吗?

任何帮助深表感谢!

4

1 回答 1

1

您需要注册 MediaWiki 名称空间并在 XPath 表达式中引用您选择的前缀。请参阅其他 SO question

就像是

titles <- xpathSApply(doc, '//mw:page/mw:title', xmlValue,
    namespaces= c(mw = "http://www.mediawiki.org/xml/export-0.8/"))

这也有效:

titles <- xpathSApply(doc, '//x:page/x:title', xmlValue, namespaces= "x")
于 2013-08-18T23:44:57.540 回答