You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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',即使退出调试模式也无法终止

问题成因

  1. 命名空间不匹配:XML文件包含多层嵌套的命名空间,根节点命名空间为urn:bvmf.052.01.xsd,而目标节点PricRpt位于内部Document节点,其命名空间为urn:bvmf.217.01.xsd。原代码中直接使用d3:前缀,未正确对应目标节点的命名空间,导致节点查询失败,返回空值。
  2. 底层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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 20:05:06