我有一大堆xml
文件需要处理。为此,我希望能够读取这些文件,并将生成的对象列表保存到磁盘上。我尝试使用readr::write_rds
保存列表,但在重新读取后,对象会被修改并且不再有效。有什么办法可以缓解这个问题吗?
library(readr)
library(xml2)
x <- read_xml("<foo>
<bar>text <baz id = 'a' /></bar>
<bar>2</bar>
<baz id = 'b' />
</foo>")
# function to save and read object
roundtrip <- function(obj) {
tf <- tempfile()
on.exit(unlink(tf))
write_rds(obj, tf)
read_rds(tf)
}
list(x)
#> [[1]]
#> {xml_document}
#> <foo>
#> [1] <bar>text <baz id="a"/></bar>
#> [2] <bar>2</bar>
#> [3] <baz id="b"/>
roundtrip(list(x))
#> [[1]]
#> {xml_document}
identical(x, roundtrip(x))
#> [1] FALSE
all.equal(x, roundtrip(x))
#> [1] TRUE
xml_children(roundtrip(x))
#> Error in fun(x$node, ...): external pointer is not valid
as_list(roundtrip(x))
#> Error in fun(x$node, ...): external pointer is not valid
一些背景信息
我有大约500,000个xml文件。为了处理它们,我计划使用 xml2::as_list
将它们转换成列表,并编写代码提取我需要的内容。后来我意识到,运行 as_list
的代价非常昂贵。我可以选择:
- 重新编写已经经过仔细调试的代码以直接解析数据(
xml_child
、xml_text
等),或者 - 使用
as_list
。
为了加速第二种方法,我可以在另一台具有更多核心的机器上运行它,但我想将单个文件传递到该机器,因为收集和复制所有文件很耗时。
as_list
快约17倍。我猜我会重新编写代码,因为一旦你学会如何处理XPATH,它更加灵活。无论如何,还是谢谢! - Thomas K