从多个XML文件中解析数据并输出到csv文件

时间:2011-03-23 04:21:13

标签: ruby xml csv cygwin

我有十几个XML文件,其中包含一些wcat web性能测试的结果。在每个XML文件中都有一个数据节点,其中包含所请求的每个页面的名称以及加载它所需的平均时间。我想从每个XML文件中提取该信息并将其输出到csv文件,这样我就可以在excel中创建漂亮的漂亮图形。

我可以使用C#的主要工作语言完成任务,但是为了提高我的脚本编写技巧,我想尝试使用unix / cygwin命令或Ruby等脚本语言来完成。

XML文件的格式为:

<report name="wcat" version="6.3.1" level="1" top="100">
 <section name="header" key="90000">
  ... lots of other XML junk...
  <item>
   <data name="reportt" >Request Name I</data>
   ...
   <data name="avgttlb" >628</data>
  </item>
  <item>
   <data name="reportt" >Request Name II</data>
   ...
   <data name="avgttlb" >793</data>
  </item>
  ... lots of other XML junk...
 </section
</report>

我需要的csv输出是:

Request,File 1,File 2,...,File 12
Request Name I,628,123,...,789
Request Name II,793,456,...,987

有没有可以解析XML的好的cygwin命令行实用程序?或者失败的是,在Ruby中有一个很好的方法吗?

3 个答案:

答案 0 :(得分:2)

您所描述的内容可以在XSLT中完成,它支持文本输出方法,多个输入文件(使用document()函数),当然还有模板。

我知道有些人发现XSLT很糟糕,但是我一直都在使用它来做这种事情而非常喜欢它。此外,它几乎与平台无关。

答案 1 :(得分:1)

在python ...

import elementTree.ElementTree
import csv

result = []
tree = elementTree.ElemenTree.parse('test.xml')
section = tree.getroot().find('section')
items = section.findall('item')
for item in items:
    records = item.findall('data')
    row = [rec.text for rec in records]
    result.append(row)

csv.writer(file('output.csv', 'w'))
csv.writerows(result)

答案 2 :(得分:1)

Ruby有一个很好的解析器叫Nokogiri,我非常喜欢。它支持XML和HTML,DOM和SAX,如果你喜欢它,可以构建XML。它建立在libxml2上。

#!/usr/bin/env ruby -w

xml = <<END_XML
<report name="wcat" version="6.3.1" level="1" top="100">
<section name="header" key="90000">
  <item>
    <data name="reportt" >Request Name I</data>
    <data name="avgttlb" >628</data>
  </item>
  <item>
    <data name="reportt" >Request Name II</data>
    <data name="avgttlb" >793</data>
  </item>
  </section
</report>
END_XML

require 'nokogiri'
doc = Nokogiri::XML(xml)
content = doc.search('item').map { |i| 
  i.search('data').map { |d| d.text }
}

content.each do |c|
  puts c.join(',')
end

# >> Request Name I,628
# >> Request Name II,793

请注意,除了标准的XPath访问器之外,Nokogiri还允许使用我在这里使用的CSS访问器。实际的解析采用了中间的四行。

Ruby有一个内置的CSV生成器/解析器,但对于这个快速的例子,我没有使用它。