我有一个非常长的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>
我真的需要多行树格式的输出格式,以便于可视化并帮助新用户理解输出。非常感谢任何帮助,因为我试图找到解决方案几个小时,但不能。
答案 0 :(得分:2)
您可以使用file
参数cat()
:
cat(saveXML(xml), file="~/Desktop/xml_format_test.xml")
看起来这个错误已被发现some years ago,但仍未修复。