我有两个XML文件,我想将其解析为R中的数据框 然后进行合并。
将XML文件导入列出的数据框
def foo():
l = []
with open("file.asd", "r") as f:
for line in f:
l.append(line)
return l
然后将其取消列出&合并,但我被困在unlist&合并不起作用......
library(XML)
library(plyr)
getxmldf<-function(xmlfile){
booksz <- xmlTreeParse(xmlfile)
xmldf<-ldply(xmlToList(booksz), data.frame)
xmldf.T <- t(xmldf[,2:ncol(xmldf)])
return(xmldf.T)
}
我附加了两个测试XML文件。它们是&#34; Cheat Engine&#34;
的地址转储https://drive.google.com/file/d/0BxCrQYKS04mRV1ZEZ1Bza2Vabkk/view?usp=sharing
https://drive.google.com/file/d/0BxCrQYKS04mRRWJUVjdqRUp3Yk0/view?usp=sharing
答案 0 :(得分:0)
我已经查看了您的文件,但他们似乎并没有很多有趣的信息。
在每个文件中有许多CheatEntry节点,每个节点包含5个节点:ID,Description,LastState,VariableType和Address。
ID总是按1顺序排列,第一个文件中的0到87,第二个文件中的0到110.
说明始终是&#39;&#34;没有说明&#34;&#39;。
LastState始终为空。它有两个属性:第一个文件中的值始终为6042,第二个文件中的值为6122,RealAddress始终与“地址”节点相同。因此,这两个属性都没有任何真实的信息要提供。
VariableType始终是&#34; 4字节&#34;。
地址有一个8位十六进制字符串,在两个文件之间和之间始终是唯一的。
考虑到上述所有情况,我不确定你为什么要合并它们。在R中,&#34;合并&#34;通常意味着加入键上的行,但是我们从这两个文件中获取的数据集之间没有共同的键。实际上,也许ID可能有意义,但鉴于你似乎已经尝试过&#34; V5&#34;在你的问题中,这似乎不正确。
我假设您希望按行合并两个data.frames,这可以通过rbind()
函数完成。我们可以使用lapply()
一次性处理这两个文件,然后使用do.call()
在每个文件data.frames上调用单个rbind()
调用。
另外,我建议避免xmlToList()
支持使用xpathApply()
对CheatEntry节点进行目标搜索,然后调用辅助xmlToDataFrame()
函数。这样我们还可以使用colClasses
的{{1}}和stringsAsFactors
参数来控制结果列的数据类型。
把所有这些放在一起,我们有:
xmlToDataFrame()