如何将xmlToDataframe折叠为单行

时间:2019-06-06 10:47:27

标签: r xml

如何在不丢失子节点的情况下将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

1 个答案:

答案 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)