首页 > 解决方案 > 如何将 xmlToDataframe 折叠成单行

问题描述

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

标签: rxml

解决方案


我从 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)

推荐阅读