R& XML - 正确格式化数据框架

时间:2016-04-05 15:46:54

标签: xml r nodes

我想从XML文件创建数据框。我只需要特定的节点,并希望以一种我可以轻松处理数据的方式进行排列。

我只对不同<stroke>节点的内容感兴趣。 我需要的是<starttime><endtime>,还有<bounds>所有子节点和所有<sample>个节点<x><y>和{{1} }子节点。

这是我目前的代码:

<time>

包含笔画数据的数据框的有趣部分如下所示:

file <- "1.xml" xmlfile <- xmlTreeParse(file) xmltop <- xmlRoot(xmlfile) values <- xmlSApply(xmltop, function(x) xmlSApply(x, xmlValue)) df <- data.frame(t(values),row.names=NULL)

似乎所有子节点的值都排队等待,因此很难使用它。那里发生了什么,我该怎么做才能正确格式化?

这是我的XML数据的快照:

UnassignedStrokes
1 1459867893629, 1459867896812, 145986789362914598678948151.0-14090101260.0750.0217.018.0260.625766.01459867893629108260.625763.6251459867893722120262.875762.01459867893775122278.0757.1251459867893935124294.875755.751459867894015124304.875755.1251459867894055124319.125755.3751459867894109124326.75754.751459867894135124355.0756.51459867894229124372.375756.3751459867894282124388.625755.3751459867894335124401.375756.1251459867894375124427.75754.3751459867894469124448.75752.1251459867894549124455.5750.8751459867894575124473.75751.251459867894669124476.125752.01459867894789124474.25751.751459867894802118469.875750.7514598678948150, 145986789589214598678968121.0-14090101364.0701.010.0125.0364.5701.0145986789589232366.0702.01459867895905106367.25702.6251459867895958120367.5703.1251459867896012122369.25724.1251459867896358126369.375748.01459867896465126370.125765.01459867896532126369.875779.51459867896598126369.125789.1251459867896638126369.375795.251459867896665126370.875803.751459867896705126373.125825.6251459867896812126

1 个答案:

答案 0 :(得分:1)

我发现rvest是处理xml文件的最佳软件包。以下不是一个完整的解决方案,但它应该足以让你开始。

library(rvest)

myxml<-read_xml("text.xml")
#find the only the stroke nodes
stroke<-xml_nodes(myxml,"stroke")
#extract the start and end times
starttime<-xml_text(xml_nodes(stroke, "starttime"))
endtime<-xml_text(xml_nodes(stroke, "endtime"))
#find the bounds nodes under each stroke node
bounds<-xml_nodes(stroke, "bounds")
#extract out the x, y width and heigth from each bound node
x<-xml_text(xml_nodes(bounds, "x"))
y<-xml_text(xml_nodes(bounds, "y"))
width<-xml_text(xml_nodes(bounds, "width"))
height<-xml_text(xml_nodes(bounds, "height"))

#save to dataframe
df<-data.frame(starttime, endtime, x, y, width, height)

这段代码假设每个&#34;笔画&#34;节点只有1个开始时间,结束时间和1&#34;界限&#34;节点。由于有多个&#34;样本&#34;每个父母的节点&#34; stroke&#34;需要注意将每个子节点分开到父节点。我将在这里开始:

samples<-sapply(stroke, FUN=xml_nodes, xpath="sample")
祝你好运。