read_xml解析XML返回character[0]及INTEGER()错误排查与参数咨询
使用xml2解析XML时返回character[0]及INTEGER()错误的解决方法
问题描述
使用R语言xml2包读取并解析XML文件时,出现两个问题:
- 预期返回字符串或数字的节点,实际返回
character[0] - 调试
read_xml函数时,控制台持续输出错误INTEGER() can only be applied to a 'integer', not a 'unknown type #29',即使退出调试模式也无法终止
问题成因
- 命名空间不匹配:XML文件包含多层嵌套的命名空间,根节点命名空间为
urn:bvmf.052.01.xsd,而目标节点PricRpt位于内部Document节点,其命名空间为urn:bvmf.217.01.xsd。原代码中直接使用d3:前缀,未正确对应目标节点的命名空间,导致节点查询失败,返回空值。 - 底层libxml2解析问题:
INTEGER()错误来自xml2依赖的libxml2库,通常是解析XML中的特殊节点(如空白节点、格式异常节点)时触发的底层类型转换问题。
解决方法
1. 正确处理命名空间(推荐简化方式)
使用xml_ns_strip()移除XML中的所有命名空间,直接通过节点名查询,避免前缀匹配错误:
library(dplyr) library(xml2) # 读取XML文件 test <- read_xml("path/XMLbulletinsample.xml", encoding = "UTF-8") # 移除所有命名空间,简化节点查询 test_stripped <- xml_ns_strip(test) # 查询所有PricRpt节点 reports <- xml_find_all(test_stripped, ".//PricRpt") data_list <- list() # 循环提取节点数据 for (report in reports) { trad_dt <- xml_text(xml_find_first(report, ".//TradDt/Dt")) ticker <- xml_text(xml_find_first(report, ".//SctyId/TckrSymb")) open_interest <- xml_text(xml_find_first(report, ".//FinInstrmAttrbts/OpnIntrst")) first_price <- xml_text(xml_find_first(report, ".//FinInstrmAttrbts/FrstPric")) min_price <- xml_text(xml_find_first(report, ".//FinInstrmAttrbts/MinPric")) max_price <- xml_text(xml_find_first(report, ".//FinInstrmAttrbts/MaxPric")) avg_price <- xml_text(xml_find_first(report, ".//FinInstrmAttrbts/TradAvrgPric")) last_price <- xml_text(xml_find_first(report, ".//FinInstrmAttrbts/LastPric")) data_list[[length(data_list) + 1]] <- data.frame( trad_dt = trad_dt, ticker = ticker, open_interest = as.numeric(open_interest), first_price = as.numeric(first_price), min_price = as.numeric(min_price), max_price = as.numeric(max_price), avg_price = as.numeric(avg_price), last_price = as.numeric(last_price), stringsAsFactors = FALSE ) } # 合并为dataframe df <- bind_rows(data_list)
2. 修复INTEGER()错误
若移除命名空间后仍出现该错误,可尝试:
- 添加解析选项:在
read_xml中加入options = list(NOBLANKS = TRUE),移除XML中的空白节点:test <- read_xml("path/XMLbulletinsample.xml", encoding = "UTF-8", options = list(NOBLANKS = TRUE)) - 重装xml2包:确保依赖的libxml2库为最新版本,执行
install.packages("xml2", type = "binary")重装。
内容的提问来源于stack exchange,提问作者vini_serpa
相关产品推荐
相关产品推荐

