R从XML文件的特定元素中获取所有信息

时间:2014-06-08 20:49:28

标签: xml r

我有一个XML文件,我试图从元素中获取所有信息" identificatie"和" gebruiksdoelVerblijfsobject"并希望将它们放入数据帧(甚至更好的data.table,但这不是强制性的)。 XML文件包含许多元素。我将尝试用我的XML新手解释。

这是文件本身:http://www.filedropper.com/xmlfile

文件结构如下。

BAG-Extract-Deelbestand-LVC
    antwoord
        vraag
        producten
            LVC-product (list of 1774)
                Verblijfsobject
                    identificatie
                    gebruiksdoelVerblijfsobject

我能够得到一个"识别"和" gebruiksdoelVerblijfsobject"但我似乎无法将它们全部从XML文件中删除。

有人可以帮帮我吗?库(XML)已启用。

亲切的问候和提前谢谢,

罗伯特

1 个答案:

答案 0 :(得分:3)

您需要使用提供的namespaces

xData <- xmlParse("PATH/ToFILE")
identificatie <- xpathSApply(xData, 
                             path = "//product_LVC:LVC-product/*/bag_LVC:identificatie"
                             , xmlValue)
> head(identificatie)
[1] "0362010002211033" "0362010002211034" "0362010002211035" "0362010002211036"
[5] "0362010002211037" "0362010002211038"

gebruiksdoelVerblijfsobject <- xpathSApply(xData, 
                                           path = "//product_LVC:LVC-product/*/bag_LVC:gebruiksdoelVerblijfsobject"
                                           , xmlValue)
> head(gebruiksdoelVerblijfsobject)
[1] "overige gebruiksfunctie" "overige gebruiksfunctie" "overige gebruiksfunctie"
[4] "overige gebruiksfunctie" "overige gebruiksfunctie" "overige gebruiksfunctie"
> unique(gebruiksdoelVerblijfsobject)
 [1] "overige gebruiksfunctie" "bijeenkomstfunctie"      "kantoorfunctie"         
 [4] "industriefunctie"        "sportfunctie"            "winkelfunctie"          
 [7] "woonfunctie"             "gezondheidszorgfunctie"  "logiesfunctie"          
[10] "onderwijsfunctie"  

编辑:找到不匹配

voNodes <- getNodeSet(xData, path = "//product_LVC:LVC-product/bag_LVC:Verblijfsobject")

out <- lapply(voNodes, function(x){
  identificatie <- xpathSApply(x, "./bag_LVC:identificatie", xmlValue, namespaces= c(bag_LVC = "http://www.kadaster.nl/schemas/imbag/lvc/v20090901"))
  gebruiksdoelVerblijfsobject <- xpathSApply(x, path = "./bag_LVC:gebruiksdoelVerblijfsobject", xmlValue, namespaces= c(bag_LVC = "http://www.kadaster.nl/schemas/imbag/lvc/v20090901"))
  list(id = identificatie, gvo = gebruiksdoelVerblijfsobject)
})

> which(sapply(lapply(out, "[[", "gvo"), length) != 1)
 [1] 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1409 1410 1647
[18] 1648 1649 1708 1740

对于上面列出的这些节点,gvoid的1个条目。

voNodes <- getNodeSet(xData, path = "//product_LVC:LVC-product/bag_LVC:Verblijfsobject")
# for each product get the
out <- lapply(voNodes, function(x){
  identificatie <- xpathSApply(x, "./bag_LVC:identificatie", xmlValue, namespaces= c(bag_LVC = "http://www.kadaster.nl/schemas/imbag/lvc/v20090901"))
  gebruiksdoelVerblijfsobject <- xpathSApply(x, path = "./bag_LVC:gebruiksdoelVerblijfsobject", xmlValue, namespaces= c(bag_LVC = "http://www.kadaster.nl/schemas/imbag/lvc/v20090901"))
  data.frame(id = identificatie, gvo1 = gebruiksdoelVerblijfsobject[1], gvo2 = gebruiksdoelVerblijfsobject[2])
})
require(plyr)
res <- rbind.fill(out)

> head(res)
                id                    gvo1 gvo2
1 0362010002211033 overige gebruiksfunctie <NA>
2 0362010002211034 overige gebruiksfunctie <NA>
3 0362010002211035 overige gebruiksfunctie <NA>
4 0362010002211036 overige gebruiksfunctie <NA>
5 0362010002211037 overige gebruiksfunctie <NA>
6 0362010002211038 overige gebruiksfunctie <NA>