我想从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
答案 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")
祝你好运。