rml中的xml:提取节点集的xml值

时间:2014-03-12 10:20:33

标签: xml r web-scraping

我试图从(非常大的)文档中提取某些xml值。因为我只对某些节点感兴趣,所以我创建了子集。

library(XML)
data.raw <- xmlParse(file="in/data.xml", encoding="UTF-8")
data.top <- xmlRoot(data.raw)
subset.wkr67 <-  getNodeSet(doc=data.top, "//wahl[@jahr='13']/gebiet[@schluessel='67']/wvt")

最后一个对象看起来像这样(fyi,这些是对某些地区有绝对投票数的选举结果):

[[1]]
<wvt kurz="CDU" lang="Christlich Demokratische Union Deutschlands in Niedersachsen" button="CDU">
    <ergebnis kurz="STWVT" lang="Zweitstimmen">
        <stimmen>21478</stimmen>
        <farbe>#0033CC</farbe>
        <prozent>57.6</prozent>
    </ergebnis>
    <ergebnis kurz="STKAND" lang="Erststimmen">
        <stimmen>25835</stimmen>
        <farbe>#0033CC</farbe>
        <prozent>69.4</prozent>
    </ergebnis>
</wvt>

[[2]]
...   

attr(,"class")
[1] "XMLNodeSet"

我想提取不同层级的绝对投票数;它们应该保存在单独的对象中。据我所知,这应该可以使用xmlValue和sapply。

为了提取&#34;刺激的价值&#34;元素是元素的兄弟元素&#34; ergebnis&#34;属性&#34; kurz&#34; =&#34; STWVT&#34; (在我的例子中:21478),我试图这样做:

sapply(subset.wkr67, xmlValue, '/wvt/ergebnis[@kurz="STWVT"]/stimmen') 
[1] "21478#0033CC57.625835#0033CC69.4" "6640#FFDFDF17.86308#FFDFDF17.0"   "4682#99990012.61410#FFFF993.8"    "2663#CCFFCC7.11888#CCFFCC5.1"    
[5] "708#C979E31.9848#B953EC2.3"       "220.1"                            "3731.0"                           "830.2"                           
[9] "2140.6"                           "1520.4"                           "1220.3"                           "542#F5A5541.5541#F5A5541.5"      
[13] "593#ECF0EC1.6373#ECF0EC1.0" 

我以某种方式提取了太多的信息。 (每个元素基本上都是粘贴在一起的所有元素的值.13的长度是可以的并且适合数据。) (如果我进一步向R命令添加选项&#34; recursive = FALSE&#34;我的结果是一个长度相同的向量,只包含字符。)

如何只提取&#34;刺激的第一个值&#34;元件? (在我的情况下是21478)感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

假设您只在xml文件中显示了数据(带标题),请尝试以下操作:

library(XML)
doc = xmlParseDoc("wahl.xml")
xpathSApply(doc,"/wvt/ergebnis",xmlAttrs) 
xpathSApply(doc,"/wvt/ergebnis/stimmen",xmlValue)

应该遵循一些转换到数据框来获取每个投票集的描述符。