如何在R语言中解析FIXML格式数据?
在R中解析FIXML(属性存储型XML)
核心思路
FIXML的核心数据都存在标签属性而非文本节点里,解析时要重点提取节点属性,再通过数据框合并、宽格式转换得到目标结构。下面用xml2+dplyr+tidyr实现完整流程。
步骤1:准备示例FIXML
先模拟一段符合场景的FIXML(本地文件直接用read_xml("your_file.xml")读取):
<FIXML xmlns="http://www.fixprotocol.org/FIXML-5-0-SP2"> <SecDef Src="D" ID="12345" Ver="1"> <Hdr SID="BRKR" TID="CLNT" SSub="X" TSub="Y" Dt="2024-05-20"/> <Instrmt Sym="AAPL" SecTyp="EQ" Exch="NASDAQ" CFI="ES"/> <InstrmtExt> <Attrb N="MarketCap" V="2.9T"/> <Attrb N="Sector" V="Technology"/> <Attrb N="Industry" V="Consumer Electronics"/> </InstrmtExt> </SecDef> </FIXML>
步骤2:加载依赖库
library(xml2) library(dplyr) library(tidyr)
步骤3:解析并提取各层级属性
# 读取FIXML(字符串用read_xml,文件用read_xml("path/to/file.xml")) fixml <- read_xml('上面的XML字符串') # 提取命名空间(FIXML通常带命名空间,必须处理) ns <- xml_ns(fixml) # 1. 提取SecDef节点属性,转成数据框 sec_def_df <- xml_find_first(fixml, ".//f:SecDef", ns = ns) %>% xml_attrs() %>% as.data.frame() %>% t() %>% as.data.frame(stringsAsFactors = FALSE) # 2. 提取Hdr节点属性并合并 hdr_df <- xml_find_first(fixml, ".//f:Hdr", ns = ns) %>% xml_attrs() %>% as.data.frame() %>% t() %>% as.data.frame(stringsAsFactors = FALSE) sec_def_df <- bind_cols(sec_def_df, hdr_df) # 3. 提取Instrmt节点属性并合并 instrmt_df <- xml_find_first(fixml, ".//f:Instrmt", ns = ns) %>% xml_attrs() %>% as.data.frame() %>% t() %>% as.data.frame(stringsAsFactors = FALSE) sec_def_df <- bind_cols(sec_def_df, instrmt_df) # 4. 处理InstrmtExt下的Attrb:转成宽格式(N为列名,V为值) instrmt_ext_df <- xml_find_all(fixml, ".//f:Attrb", ns = ns) %>% map_dfr(~tibble(name = xml_attr(., "N"), value = xml_attr(., "V"))) %>% pivot_wider(names_from = name, values_from = value) # 合并所有数据框得到最终结果 final_df <- bind_cols(sec_def_df, instrmt_ext_df)
最终结果
final_df会包含:
- SecDef的所有属性列(Src、ID、Ver)
- Hdr的所有属性列(SID、TID、SSub、TSub、Dt)
- Instrmt的所有属性列(Sym、SecTyp、Exch、CFI)
- InstrmtExt下Attrb对应的列(MarketCap、Sector、Industry)
注意事项
- 若存在多个SecDef节点,把
xml_find_first换成xml_find_all,用map_dfr批量处理 - 命名空间需匹配你的FIXML版本(示例用FIXML 5.0 SP2,根据实际调整)
- 属性值有特殊格式(如日期、数字)时,可在合并后用
mutate转换类型
内容的提问来源于stack exchange,提问作者elmattador
相关产品推荐
相关产品推荐

