将数据帧转换为XML

时间:2014-11-12 11:40:52

标签: xml r dataframe

我有一个如下所示的数据帧df:

    CODE     GROUP      SET 
1   100      6000       20
2   100      7000       30
3   200      8000       40

如何根据以下示例管道分离并包装数据框行?

<rows>
<row>100|6000|20</row>
<row>100|7000|30</row>
<row>200|8000|40</row>
<rows>

3 个答案:

答案 0 :(得分:3)

您可以使用xmlOutputDOM功能。它使用各种方法创建一个对象来创建XML:

myDF <- read.table(text = "    CODE     GROUP      SET 
1   100      6000       20
2   100      7000       30
3   200      8000       40", header = TRUE)

library(XML)
con <- xmlOutputDOM(tag="rows")
apply(myDF, 1, function(x){
  con$addTag("row", paste(x, collapse = "|"))
})


> (myXML <- con$value())
<rows>
  <row>100|6000|20</row>
  <row>100|7000|30</row>
  <row>200|8000|40</row>
</rows>

要将创建的XML输出为字符,您可以使用saveXML

> cat(saveXML(myXML))
<?xml version="1.0"?>
<rows>
 <row>100|6000|20</row>
 <row>100|7000|30</row>
 <row>200|8000|40</row>
</rows>

答案 1 :(得分:3)

您可以使用包xmlNode

中的XML
library(XML)
vals <- do.call(paste, c(myDF, sep = "|"))
node <- xmlNode("rows", .children = lapply(vals, xmlNode, name = "row"))

这将生成以下XML节点

<rows>
 <row>100|6000|20</row>
 <row>100|7000|30</row>
 <row>200|8000|40</row>
</rows>

class(node)
# [1] "XMLNode"          "RXMLAbstractNode" "XMLAbstractNode" 

其中myDF是@ jdharrison回答的数据。

答案 2 :(得分:2)

不花哨,但是:

sprintf("<rows>\n%s\n</rows>\n", paste(apply(dat, 1, function(x) {
  paste("<row>", paste(x, collapse="|"), "</row>", sep="")
}), collapse="\n"))
## [1] "<rows>\n<row>100|6000|20</row>\n<row>100|7000|30</row>\n<row>200|8000|40</row></rows>\n"

使用writeLines将其保存到文件中,您会看到:

<rows>
<row>100|6000|20</row>
<row>100|7000|30</row>
<row>200|8000|40</row>
</rows>