使用R的XML与xml2包解析SEC EDGAR XML文件遇空数据框问题
问题原因
你得到空数据框的核心原因是XML存在命名空间,目标节点edgarSubmission属于http://www.sec.gov/edgar/ncen命名空间,而你用getNodeSet查询时未指定命名空间,导致找不到对应节点,最终xmlToDataFrame生成空数据框。此外,edgarSubmission节点本身是嵌套结构,直接转换无法提取到深层的实际数据。
解决方案
方法1:用XML包处理命名空间并提取深层节点
- 读取XML时直接用XML包的
xmlParse(无需先通过xml2读取,减少转换步骤) - 指定命名空间后查询目标节点,选择嵌套的实际数据节点(比如
ncenForm下的核心申报内容)
代码示例:
library(XML) # 下载XML文件 download.file("https://www.sec.gov/Archives/edgar/data/1026144/000175272424054979/primary_doc.xml", destfile = "ncen.xml") # 读取XML ncen.xml <- xmlParse("ncen.xml") # 定义命名空间 ns <- c(sec = "http://www.sec.gov/edgar/ncen") # 查询深层数据节点(ncenForm包含核心申报数据) nodes <- getNodeSet(ncen.xml, "//sec:ncenForm", namespaces = ns) # 转换为数据框 xml.df <- xmlToDataFrame(nodes, namespaces = ns)
方法2:用xml2包更灵活地提取数据
xml2对命名空间的处理更直观,结合dplyr/purrr可以精准提取嵌套数据:
library(xml2) library(dplyr) library(purrr) # 下载并读取XML download.file("https://www.sec.gov/Archives/edgar/data/1026144/000175272424054979/primary_doc.xml", destfile = "ncen.xml") ncen.data <- read_xml("ncen.xml") # 读取XML自带的命名空间 ns <- xml_ns(ncen.data) # 提取filerInfo下的核心信息作为示例 filer_info <- ncen.data %>% xml_find_all(".//sec:filerInfo", ns) %>% map_dfr(~list( cik = xml_find_first(.x, ".//sec:cik", ns) %>% xml_text(), companyName = xml_find_first(.x, ".//sec:companyName", ns) %>% xml_text(), filingDate = xml_find_first(.x, "//sec:filingDate", ns) %>% xml_text() )) # 查看结果 print(filer_info)
注意事项
- SEC EDGAR的XML结构通常嵌套较深,需要根据你需要的具体数据调整XPath路径(可直接用浏览器打开XML文件查看节点层级)
- 如果需要提取全量嵌套数据,可先使用
xmlToList转换为列表,再根据结构整理成数据框
内容的提问来源于stack exchange,提问作者Grillo
相关产品推荐
相关产品推荐

