如何解析Rinto数据框中的复杂xml?

时间:2019-05-01 02:19:27

标签: r xml

我想用R中的下面的布局解析一个嵌套的xml文件,并将其加载到数据帧中。我尝试使用几种方法,包括xml和xml2软件包,但无法正常工作。

<?xml version="1.0" encoding="UTF-8"?>
<Targets>
<Target TYPE="myserver.mgmt.Metric" NAME="metric1">
<Attribute NAME="name" VALUE="metric1"></Attribute>
<Attribute NAME="Value" VALUE="2.4"></Attribute>
<Attribute NAME="collectionTime" VALUE="1525118288000"></Attribute>
<Attribute NAME="State" VALUE="normal"></Attribute>
<Attribute NAME="ObjectName" VALUE="obj1"></Attribute>
<Attribute NAME="ValueHistory" VALUE="5072"></Attribute>
</Target>
...
<Target TYPE="myserver.mgmt.Metric" NAME="metric999">
<Attribute NAME="name" VALUE="metric999"></Attribute>
<Attribute NAME="Value" VALUE="60.35"></Attribute>
<Attribute NAME="collectionTime" VALUE="1525118288000"></Attribute>
<Attribute NAME="State" VALUE="normal"></Attribute>
<Attribute NAME="ObjectName" VALUE="obj1"></Attribute>
<Attribute NAME="ValueHistory" VALUE="9550"></Attribute>
</Target>
</Targets>

我希望得到的最终结果是:

name    Value   collectionTime  State   ObjectName  ValueHistory
metric1 2.4     1525118288000   normal  obj1        5072
metric2 60.35   1525118288000   normal  obj2        9550

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

我们可以将XMLtidyverse一起使用

library(XML)
library(tidyverse)
lst1 <- getNodeSet(xml1, path = "//Target")
map_df(seq_along(lst1), ~ 
     XML:::xmlAttrsToDataFrame(lst1[[.x]])  %>% 
        mutate_all(as.character) %>%
        deframe %>%
        as.list %>% 
        as_tibble) %>%
        mutate_all(type.convert, as.is = TRUE)
# A tibble: 2 x 6
#  name      Value collectionTime State  ObjectName ValueHistory
#  <chr>     <dbl>          <dbl> <chr>  <chr>             <int>
#1 metric1     2.4  1525118288000 normal obj1               5072
#2 metric999  60.4  1525118288000 normal obj1               9550

数据

xml1 <- xmlParse('<?xml version="1.0" encoding="UTF-8"?>
<Targets>
<Target TYPE="myserver.mgmt.Metric" NAME="metric1">
<Attribute NAME="name" VALUE="metric1"></Attribute>
<Attribute NAME="Value" VALUE="2.4"></Attribute>
<Attribute NAME="collectionTime" VALUE="1525118288000"></Attribute>
<Attribute NAME="State" VALUE="normal"></Attribute>
<Attribute NAME="ObjectName" VALUE="obj1"></Attribute>
<Attribute NAME="ValueHistory" VALUE="5072"></Attribute>
</Target>
<Target TYPE="myserver.mgmt.Metric" NAME="metric999">
<Attribute NAME="name" VALUE="metric999"></Attribute>
<Attribute NAME="Value" VALUE="60.35"></Attribute>
<Attribute NAME="collectionTime" VALUE="1525118288000"></Attribute>
<Attribute NAME="State" VALUE="normal"></Attribute>
<Attribute NAME="ObjectName" VALUE="obj1"></Attribute>
<Attribute NAME="ValueHistory" VALUE="9550"></Attribute>
</Target>
</Targets>
')