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

标签 r xml

我需要解析 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/

相关文章:

java - 带 vector 绘图的 RadioButton

xml - 在 Oracle 中更新 xml 元素值

r - 将 RDS 文件从 github 导入 R Windows

如果匹配,用另一个数据框替换列名

r - ggplot2:geom_histogram 无法处理大的异常值?

c# - C# 向字典中添加数据

java - 字体不适用于 CheckBox 和 Switch Android Studio 3

c# - 如何向 Xelement 添加属性

r - 如何找到未引用的环境?

r - 无法加载 tidyverse 库