我有十几个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中有一个很好的方法吗?
答案 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生成器/解析器,但对于这个快速的例子,我没有使用它。