格式化saveXML输出以保留R中的树结构

时间:2018-02-12 18:16:59

标签: r xml

我有一个非常长的xml文件,我在R中生成,当我将最终的xml打印到控制台时,它保留了可视化树结构,使输出易于人类阅读。当我使用saveXML将其写入文件时,它打印出一个巨大的单行。有谁知道如何让saveXML函数打印它并维护多行树结构?我到处寻找,找不到解决方案。

一个小玩具示例(代码取自https://stat.ethz.ch/pipermail/r-help/2008-September/175364.html):

data <- read.csv(textConnection('"date","UYG.Open","UYG.High","UYG.Low","UYG.Close","UYG.Volume","UYG.Adjusted"
                      "2007-02-01",71.32,71.34,71.32,71.34,200,69.23
                      "2007-02-02",72.2,72.2,72.2,72.2,200,70.06
                      "2007-02-05",71.76,71.76,71.76,71.76,5100,69.63
                      "2007-02-06",72.85,72.85,72.85,72.85,3800,70.69
                      "2007-02-07",72.85,72.85,72.85,72.85,0,70.69'),
       as.is=TRUE)

 library(XML)

xml <- xmlTree()
xml$addTag("document", close=FALSE)
for (i in 1:nrow(data)) {
  xml$addTag("row", close=FALSE)
  for (j in names(data)) {
xml$addTag(j, data[i, j])
  }
   xml$closeTag()
}
    xml$closeTag()

# view the result
cat(saveXML(xml))

saveXML(xml, file="~/Desktop/xml_format_test.xml", compression = 0, indent=TRUE, prefix = '<?xml version="1.0"?>\n', doctype = NULL)

当我运行&#39; cat(saveXML(xml))命令时,我得到以下结构:

<?xml version="1.0"?>

<document>
  <row>
    <date>                          2007-02-01</date>
    <UYG.Open>71.32</UYG.Open>
    <UYG.High>71.34</UYG.High>
    <UYG.Low>71.32</UYG.Low>
    <UYG.Close>71.34</UYG.Close>
    <UYG.Volume>200</UYG.Volume>
    <UYG.Adjusted>69.23</UYG.Adjusted>
  </row>
  <row>
    <date>                          2007-02-02</date>
    <UYG.Open>72.2</UYG.Open>
    <UYG.High>72.2</UYG.High>
    <UYG.Low>72.2</UYG.Low>
    <UYG.Close>72.2</UYG.Close>
    <UYG.Volume>200</UYG.Volume>
    <UYG.Adjusted>70.06</UYG.Adjusted>
  </row>
  <row>
    <date>                          2007-02-05</date>
    <UYG.Open>71.76</UYG.Open>
    <UYG.High>71.76</UYG.High>
    <UYG.Low>71.76</UYG.Low>
    <UYG.Close>71.76</UYG.Close>
    <UYG.Volume>5100</UYG.Volume>
    <UYG.Adjusted>69.63</UYG.Adjusted>
  </row>
  <row>
    <date>                          2007-02-06</date>
    <UYG.Open>72.85</UYG.Open>
    <UYG.High>72.85</UYG.High>
    <UYG.Low>72.85</UYG.Low>
    <UYG.Close>72.85</UYG.Close>
    <UYG.Volume>3800</UYG.Volume>
    <UYG.Adjusted>70.69</UYG.Adjusted>
  </row>
  <row>
    <date>                          2007-02-07</date>
    <UYG.Open>72.85</UYG.Open>
    <UYG.High>72.85</UYG.High>
    <UYG.Low>72.85</UYG.Low>
    <UYG.Close>72.85</UYG.Close>
    <UYG.Volume>0</UYG.Volume>
    <UYG.Adjusted>70.69</UYG.Adjusted>
  </row>
</document>

但是当我使用saveXML(xml, file="~/Desktop/xml_format_test.xml", compression = 0, indent=TRUE, prefix = '<?xml version="1.0"?>\n', doctype = NULL)打印时,我得到以下结构:

<?xml version="1.0"?>
 <document>   <row>     <date>                          2007-02-01</date>     <UYG.Open>71.32</UYG.Open>     <UYG.High>71.34</UYG.High>     <UYG.Low>71.32</UYG.Low>     <UYG.Close>71.34</UYG.Close>     <UYG.Volume>200</UYG.Volume>     <UYG.Adjusted>69.23</UYG.Adjusted>   </row>   <row>     <date>                          2007-02-02</date>     <UYG.Open>72.2</UYG.Open>     <UYG.High>72.2</UYG.High>     <UYG.Low>72.2</UYG.Low>     <UYG.Close>72.2</UYG.Close>     <UYG.Volume>200</UYG.Volume>     <UYG.Adjusted>70.06</UYG.Adjusted>   </row>   <row>     <date>                          2007-02-05</date>     <UYG.Open>71.76</UYG.Open>     <UYG.High>71.76</UYG.High>     <UYG.Low>71.76</UYG.Low>     <UYG.Close>71.76</UYG.Close>     <UYG.Volume>5100</UYG.Volume>     <UYG.Adjusted>69.63</UYG.Adjusted>   </row>   <row>     <date>                          2007-02-06</date>     <UYG.Open>72.85</UYG.Open>     <UYG.High>72.85</UYG.High>     <UYG.Low>72.85</UYG.Low>     <UYG.Close>72.85</UYG.Close>     <UYG.Volume>3800</UYG.Volume>     <UYG.Adjusted>70.69</UYG.Adjusted>   </row>   <row>     <date>                          2007-02-07</date>     <UYG.Open>72.85</UYG.Open>     <UYG.High>72.85</UYG.High>     <UYG.Low>72.85</UYG.Low>     <UYG.Close>72.85</UYG.Close>     <UYG.Volume>0</UYG.Volume>     <UYG.Adjusted>70.69</UYG.Adjusted>   </row> </document>

我真的需要多行树格式的输出格式,以便于可视化并帮助新用户理解输出。非常感谢任何帮助,因为我试图找到解决方案几个小时,但不能。

1 个答案:

答案 0 :(得分:2)

您可以使用file参数cat()

cat(saveXML(xml), file="~/Desktop/xml_format_test.xml")

看起来这个错误已被发现some years ago,但仍未修复。