![](/img/trans.png)
[英]Merging multiple data files into a single output then creating a file from this
[英]Parse data from multiple XML files and output to csv file
我有十幾個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中有一個很好的方法嗎?
您所描述的內容可以在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)
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
請注意,Nokogiri允許使用我在這里使用的CSS訪問器,以及標准的XPath訪問器。 實際的解析采用了中間的四行。
Ruby有一個內置的CSV生成器/解析器,但對於這個快速的臟例子,我沒有使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.