在R中过滤XML列表对象

时间:2018-01-22 21:21:01

标签: r xml list

我正在尝试解析通过亚马逊AWS提供的IRS 990表单文件。这是一个例子: https://s3.amazonaws.com/irs-form-990/201541349349307794_public.xml

我正在使用XML包读入并解析XML文档,如下所示:

require(XML)
x <- read_xml("https://s3.amazonaws.com/irs-form990/201541349349307794_public.xml")
data <- xmlParse(x)
xml_data <- xmlToList(data)

上面的代码完美地将XML转换为列表对象。现在我将它作为列表对象,我想获得第VII部分附表A Grp中列出的人员的所有名称和相关信息的列表。 XML文档的屏幕截图(名称已编辑):

Screen capture of XML document

如您所见,列出了几个名称(截图仅为示例)。但是,当我尝试按如下方式过滤R列表对象时:

xml_data$ReturnData$IRS990$Form990PartVIISectionAGrp

我只收到文档中第一个名称的信息。尽管它们的节点都在Form990PartVIISectionAGrp文档中列出,但其他所有节点都没有出现。

我在这里缺少什么?如何返回包含所有文档该部分中包含的名称和信息的对象?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

考虑直接解析数据帧,因为这些节点处于一致的级别。但是,您需要为文档中的默认命名空间映射用户定义的前缀 doc

library(XML)

data <- readLines("https://s3.amazonaws.com/irs-form-990/201541349349307794_public.xml")

doc <- xmlParse(data)

df <- xmlToDataFrame(nodes=getNodeSet(doc, "//doc:Form990PartVIISectionAGrp",
                                      namespaces = c(doc="http://www.irs.gov/efile")))

<强>输出

df
#          PersonNm                  TitleTxt AverageHoursPerWeekRt IndividualTrusteeOrDirectorInd ReportableCompFromOrgAmt ReportableCompFromRltdOrgAmt OtherCompensationAmt OfficerInd
# 1         -------     CHAIRMAN OF THE BOARD                 16.00                              X                        0                            0                    0       <NA>
# 2         ------- ASSISTANT SECRETARY/BOARD                  8.00                              X                        0                            0                    0          X
# 3         -------              BOARD MEMBER                  8.00                              X                        0                            0                    0       <NA>
# 4         -------    SECRETARY/BOARD MEMBER                 16.00                              X                        0                            0                    0          X
# 5         -------              BOARD MEMBER                  8.00                              X                        0                            0                    0       <NA>
# 6         -------                       CFO                 16.00                           <NA>                        0                            0                    0          X
# 7         -------             PRESIDENT/CEO                 40.00                           <NA>                   110886                            0                    0          X