gpt4 book ai didi

r - R不同文件结构中的XML数据

转载 作者:数据小太阳 更新时间:2023-10-29 02:33:10 24 4
gpt4 key购买 nike

我需要解析 2000 个 XML 文件。我管理了可以自动从文件中获取数据的设置。由于我是一个完全的初学者,它可能看起来很乱,这里有一个例子:

filenames <- list.files("C:/...", recursive=TRUE, full.names=TRUE, pattern=".xml")

name <- unlist(lapply(filenames, function(f) {
xml <- xmlParse(f)
xpathSApply(xml, "//...", xmlValue)
}))
data <- data.frame(name)

这适用于我需要的大部分数据,但我目前的问题是某些文件缺少特定数据,因此由于行数不同,我无法包含它们。文件的外观示例如下:文件 1:

<Kontaktdaten>
<Name> Name </Name>
<ID>12345678</ID>
<Kontakt_Zugang>
<Strasse>ABC-Strasse</Strasse>
<Hausnummer>1</Hausnummer>
<Postleitzahl>12345</Postleitzahl>
<Ort>ABC</Ort>
</Kontakt_Zugang>
</Kontaktdaten>

文件 2(例如缺少“Hausnummer”):

<Kontaktdaten>
<Name> Name2 </Name>
<ID>8765321</ID>
<Kontakt_Zugang>
<Strasse>CBA-Strasse</Strasse>
<Postleitzahl>54321</Postleitzahl>
<Ort>CBA</Ort>
</Kontakt_Zugang>
</Kontaktdaten>

有什么办法可以将它们组合在一个数据框架中,或者仅使用“Hausnummer”和 ID 创建第二个数据框架?

编辑:这只是一个说明我的问题的例子。原始文件长达 500 个节点,其中一些被加倍。

最佳答案

这是一个解析每个xml文件的解决方案,在各个文件中创建子节点列表,然后组合所有列表,然后转换为所需的格式。

有关分步说明,请参阅代码注释。

library(xml2)

#list of files to process
fnames<-c("xml1.xml", "xml2.xml")

dfs<-lapply(fnames, function(fname) {
doc<-read_xml(fname)


#find Name and ID
Name<-trimws(xml_text(xml_find_all(doc, ".//Name")))
ID<-trimws(xml_text(xml_find_all(doc, ".//ID")))

#find all of the nodes/records under the Kontakt_Zugang node
nodes<-xml_children(xml_find_all(doc, ".//Kontakt_Zugang"))

#find the sub nodes names and values
nodenames<-xml_name(nodes)
nodevalues<-trimws(xml_text(nodes))

#make data frame of all the values
df<-data.frame(file=fname, Name=Name, ID=ID, node.names=nodenames,
values=nodevalues, stringsAsFactors = FALSE)

})

#Make one long df
longdf<-do.call(rbind, dfs)

#make into a wide format
library(tidyr)
finalanswer<-spread(longdf, key=node.names, value=values)

最终结果如下:

#     file  Name       ID Hausnummer Ort Postleitzahl     Strasse
# xml1.xml Name 12345678 1 ABC 12345 ABC-Strasse
# xml2.xml Name2 8765321 <NA> CBA 54321 CBA-Strasse

关于r - R不同文件结构中的XML数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54237549/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com