如何在不丢失子节点的情况下将xml转换为单行数据框。
这是我的代码减去查询,我尝试了foo的不同组合,但它们没有做我想要的事情。
xmltmp=xmlParse(xml)
xmlr=xmlRoot(xmltmp)
foo=xmlr[[1]]
xmldf=xmlToDataFrame(foo, stringsAsFactors = F)
> xmlr
<submission xmlns="http://opendatakit.org/submissions" xmlns:orx="http://openrosa.org/xforms">
<data>
<odk_chmin2 id="odk_chmin2" instanceID="uuid:748ffcc4-c4a2-4341-b613-fd3d0b7e83bd" version="20180531" submissionDate="2018-11-14T09:05:15.228-06:00" isComplete="true" markedAsCompleteDate="2018-11-14T09:05:15.228-06:00">
<colecta>
<cve_orig>IOR2015LI000559</cve_orig>
<fecha>2015-04-18</fecha>
<sitio>NTP2</sitio>
</colecta>
<geo_temp>
<temp>14.2700000000</temp>
<precip>9.5000000000</precip>
<veg>pino_encinoNTP</veg>
</geo_temp>
...
</odk_chmin2>
</data>
<mediaFile>
...
</mediaFile>
...
</submission>
cve_orig fecha sitio temp precip veg
1 IOR2015LI000559 2015-04-18 NTP2 14.2700000000 9.5000000000 pino_encinoNTP
我希望将结果单行显示,但从以前的结果中可以得出: foo = xmlr [[1]]仅执行一行,但连接子节点
colecta geo_temp
1 IOR2015LI0005592015-04-18NTP2 14.27000000009.5000000000pino_encinoNTP
另一方面,foo = xmlr [[1]] [[1]]正确地标记了列,但为每个节点添加了一行,如何将其折叠为一行?
cve_orig fecha sitio temp precip veg
1 <NA> <NA> <NA> <NA> <NA> <NA>
2 IOR2015LI000559 2015-04-18 NTP2 <NA> <NA> <NA>
...
9 <NA> <NA> <NA> 14.2700000000 9.5000000000 pino_encinoNTP
答案 0 :(得分:0)
我从xmlr开始。即使从xml开始也应该可以工作。这个想法是使用xmlToList来展平字段。
library(tidyverse)
library(XML)
my_tree = xmlTreeParse(xmlr)
my_root = xmlRoot(my_tree)
my_children = xmlChildren(my_root)
df = xmlToList(my_children$data) %>%
unlist %>%
data.frame(X1=.) %>%
rownames_to_column() %>%
spread(rowname, X1)