plyr 的 ldply 改变了 read_xml 的行为

Posted

技术标签:

【中文标题】plyr 的 ldply 改变了 read_xml 的行为【英文标题】:plyr's ldply changes read_xml's behavior 【发布时间】:2021-05-05 05:50:29 【问题描述】:

我试图从一堆 xml 文件中的每一个中读取几个字段。我写了一个小函数来提取我需要的字段并将它们作为向量返回:

id_dir <- function(d) 
  xml <- read_xml(d)
  id <- xml_text(xml_node(xml, 'AwardID'))
  dir <- xml_text(xml_node(xml, 'Abbreviation'))
  phone <- xml_text(xml_node(xml, 'PhoneNumber'))
  return(c(id, phone, dir))

但是当我用ldply 包装它时,会发生以下情况:

setwd('xmls/2017')
files <- list.files()[1:100]
sev_data <- plyr::ldply(files, id_dir)

Error in read_xml.character(d) : xmlParseEntityRef: no name [68]

尽管以下代码按预期工作,但仍会发生这种情况:

id_dir(glue('xmls/2017/files[1]'))

"1700003" "5746317432" "MPS"

我已经尝试过一段时间了,但大多数时候我看到人们在谈论 php 和很可能无关紧要的东西。

为了重现性,here 是我正在读取的文件的couple。

【问题讨论】:

The error suggests that at least one of the XML files is invalid,可能是与符号有关。 【参考方案1】:

您的功能按预期工作,可以通过您分享的示例进行验证。

id_dir('https://raw.githubusercontent.com/jdollman/***/data/1700229.xml')
#[1] "1700229"    "8659743466" "MPS" 
      
id_dir('https://raw.githubusercontent.com/jdollman/***/data/1715157.xml')
#[1] "1715157"    "5705773510" "BIO"       

所以问题是您如何将文件传递给函数id_dir。我不使用plyr,因为它早已退役并被dplyr 取代。我会在这里使用lapply

另一个问题可能是您的目录中有其他文件不是xml。您可以在list.files 中指定仅选择'xml' 文件。试试看:

setwd('xmls/2017')
files <- list.files(pattern = '\\.xml$')[1:100]
sev_data <- lapply(files, id_dir)

【讨论】:

以上是关于plyr 的 ldply 改变了 read_xml 的行为的主要内容,如果未能解决你的问题,请参考以下文章

AttributeError:模块“pandas”没有属性“read_xml”或“to_xml”

如何使用 pd.read_xml 正确解析 SEC cal.xml 文件?

使用 boost::asio::spawn 生成的 asio 处理程序中的 boost::property_tree::read_xml 段错误

Boost read_xml 问题解析字符串?

boost库中读取xml的函数 read_xml的第一个参数不支持中文路径?

使用 plyr 进行成对 t 检验