【发布时间】:2014-02-14 21:44:52
【问题描述】:
【问题讨论】:
【问题讨论】:
没有办法绕过它 - 您需要了解 XML 和 XPath 才能在 R 中使用它。假设您这样做了,请在浏览器中查看文档以了解其结构。然后,这应该让您开始使用 XML 包。
library(XML)
xml <- xmlParse("http://data.mcc.gov/raw/xml/MCC_HN.xml")
org <- xpathApply(xml,"//iati-activity/reporting-org",xmlValue)
id <- xpathApply(xml,"//iati-activity/iati-identifier",xmlValue)
title <- xpathApply(xml,"//iati-activity/title",xmlValue)
desc.1 <- xpathApply(xml,"//iati-activity/description[@type='1']",xmlValue)
desc.2 <- xpathApply(xml,"//iati-activity/description[@type='2']",xmlValue)
status <- xpathApply(xml,"//iati-activity/activity-status",xmlValue)
start.planned <- xpathApply(xml,"//iati-activity/activity-date[@type='start-planned']",xmlValue)
start.actual <- xpathApply(xml,"//iati-activity/activity-date[@type='start-actual']",xmlValue)
end.planned <- xpathApply(xml,"//iati-activity/activity-date[@type='end-planned']",xmlValue)
end.actual <- xpathApply(xml,"//iati-activity/activity-date[@type='end-actual']",xmlValue)
df <- data.frame(cbind(org,id, title, status,
start.planned, start.actual, end.planned, end.actual,
desc.1, desc.2))
阅读关于我上面使用过的函数的文档,例如xmlParse(...)、xpathApply(...) 和 xmlValue(...) 来弄清楚代码在做什么。
注意:XML 包中有一个函数xmlToDataFrame(...)。您的文档的问题是您有多个具有相同标签名称的元素(例如:description 和 activity-date),使用 type= 属性可以消除歧义。 xmlToDataFrame(...) 不知道如何处理,所以你需要努力去做......
【讨论】:
不清楚你想对数据做什么,但我们明白了
xml = xmlParse("http://data.mcc.gov/raw/xml/MCC_HN.xml")
然后查询所有“交易”记录的结果,并把它们做成一个数据框
df <- xmlToDataFrame(xml["//transaction"])
与
> dim(df)
[1] 730 11
> head(df, 2)
aid-type
1
2
description
1 Commitment: Honduras-614G Fund-Not Applicable-Not Applicable-2011-04-01
2 Disbursement: Honduras-614G Fund-Not Applicable-Not Applicable-2011-04-01
disbursement-channel finance-code flow-type provider-org
1 Millennium Challenge Corporation
2 Millennium Challenge Corporation
receiver-org tied-status transaction-date transaction-type value
1 Honduras 2011-04-01 COMMITMENT 274380.75
2 Honduras 2011-04-01 DISBURSEMENT 0.00
也许您想提取与“辅助类型”相关的属性并将其添加到数据框中;使用 XPath 这样做
df$`aid-type-code` <- as.character(xml["//aid-type/@code"])
【讨论】: