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 段错误