Ruby 解析来自多个XML文件的数据并输出到csv文件
我有十几个XML文件,其中包含一些wcat web性能测试的结果。在每个XML文件中都有一个数据节点,其中包含请求的每个页面的名称以及加载该页面所用的平均时间。我想从每个XML文件中提取这些信息,并将其输出到csv文件中,这样我就可以在excel中创建一个漂亮的图形 我可以用我的主要工作语言C#完成这项任务,但为了提高我的脚本编写技能,我想尝试使用unix/cygwin命令或Ruby等脚本语言来完成 XML文件的格式为:Ruby 解析来自多个XML文件的数据并输出到csv文件,ruby,xml,csv,cygwin,Ruby,Xml,Csv,Cygwin,我有十几个XML文件,其中包含一些wcat web性能测试的结果。在每个XML文件中都有一个数据节点,其中包含请求的每个页面的名称以及加载该页面所用的平均时间。我想从每个XML文件中提取这些信息,并将其输出到csv文件中,这样我就可以在excel中创建一个漂亮的图形 我可以用我的主要工作语言C#完成这项任务,但为了提高我的脚本编写技能,我想尝试使用unix/cygwin命令或Ruby等脚本语言来完成 XML文件的格式为: <report name="wcat" version="6.3.1
<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>
有没有好的cygwin命令行实用程序可以解析XML?或者,如果Ruby不能做到这一点,那么在Ruby中有一种很好的方法吗?您所描述的可以在XSLT中完成,XSLT支持文本输出方法、多个输入文件(使用
document()
函数),当然还有模板
我知道有些人觉得XSLT很恶心,但我一直在用它来做这类事情,而且我很喜欢它。另外,它非常独立于平台。您所描述的内容可以在XSLT中完成,XSLT支持文本输出方法、多个输入文件(使用
document()
函数),当然还有模板
我知道有些人觉得XSLT很恶心,但我一直在用它来做这类事情,而且我很喜欢它。另外,它几乎与平台无关。在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)
在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)
Ruby有一个很好的解析器,我非常喜欢它。它支持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
#/usr/bin/env ruby-w
xml=>请求名称II,793
注意,Nokogiri允许在标准XPath访问器之外使用CSS访问器,我在这里使用CSS访问器。实际的解析使用了中间的四行
Ruby有一个内置的CSV生成器/解析器,但是对于这个quick'n dirty示例,我没有使用它。Ruby有一个很好的解析器,名为,我非常喜欢。它支持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
#/usr/bin/env ruby-w
xml=>请求名称II,793
注意,Nokogiri允许在标准XPath访问器之外使用CSS访问器,我在这里使用CSS访问器。实际的解析使用了中间的四行
Ruby有一个内置的CSV生成器/解析器,但是对于这个快速脏的示例,我没有使用它。请原谅我的python新手,但是我如何获得elementTree模块?我在Windows7上安装了主要的Python发行版。请原谅我的Python新手,但是我如何获得elementTree模块?我在Windows7上,确实安装了主要的Python发行版。