问题是有一个文件夹./log/
包含如下文件:
jan2010.xml, feb2010.xml, mar2010.xml, jan2009.xml, feb2009.xml, mar2009.xml ...
每个xml文件都希望:
<root><record name="bob" spend="20"></record>...(more records)</root>
我想编写一段只需解析这些xml文件的ColdFusion代码(log.cfm
)。对于前端,我会让用户选择一年,然后点击提交按钮。该年度的所有内容将逐月显示在单独的表格中。每张桌子都显示了每个人的总花费。像:
person cost
bob 200
mike 300
Total 500
感谢。
答案 0 :(得分:2)
简短的回答是,如果您的XML格式正确,您可以使用XMLParse()函数将XML转换为CF数据对象。
Sergii指出XMLParse cna采用路径,因此您可以直接将文件读入其中并将结果分配给变量。
数据应该看起来像一个结构数组。在CF数据对象上使用CFDUMP进行查看并帮助您解决问题。
答案 1 :(得分:0)
如果您使用的是Windows,我强烈建议您查看Microsoft的“Log Parser”。它基本上为所有日志文件提供类似SQL的查询接口。有一个名为“Log Parser Lizard”的应用程序,它提供了一个用于测试“查询”的GUI,然后您可以使用您提出的查询来执行logparser。
不确定Linux是否有等价物。
如果您在Windows上并且有兴趣了解更多信息,请与我联系。我把它挂钩到一个ANT任务,每天晚上下载日志文件,解析它们,生成报告等等。它工作得非常好。
答案 2 :(得分:0)
具体例子:
<CFSET year = 2011 />
<CFDIRECTORY directory="#expandpath("log")#" action="list" sort="name" name="logfiles" filter="*#year#.xml" />
<CFOUTPUT query="logfiles">
<CFSET singlelogfile = xmlparse(directory & "/" & name) />
<CFSET records = XmlSearch(singlelogfile, "//record") />
<table>
<tr><td colspan="2">Month: #left(logfiles.name,3)#</td></tr>
<CFLOOP array="#records#" index="record">
<tr><td>#record.XmlAttributes.name#</td><td>#record.XmlAttributes.spend#</td></tr>
</CFLOOP>
</table>
</CFOUTPUT>
当然,您需要更改年份来自FORM-Scope,为每个人总结多个记录,并且可能(如果您可以控制)将文件名从日志更改为01-2011,02-2011,03 -2011,... 12-2011这样他们就可以直接排序了。