Разбор данных из нескольких файлов XML и вывод в файл CSV - PullRequest
1 голос
/ 23 марта 2011

У меня есть дюжина XML-файлов, которые содержат результаты некоторых тестов производительности веб-сайта wcat.В каждом 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

Есть ли какие-нибудь хорошие утилиты командной строки cygwin, которые могли бы анализировать XML?Или, в противном случае, есть хороший способ сделать это в Ruby?

Ответы [ 3 ]

2 голосов
/ 23 марта 2011

То, что вы описываете, может быть сделано в XSLT, который поддерживает метод вывода текста, несколько входных файлов (с использованием функции document()) и, конечно, шаблоны.

Я знаю, что некоторые люди находят XSLT брутто, но я все время использую его для такого рода вещей, и мне это нравится. Кроме того, он практически не зависит от платформы.

1 голос
/ 23 марта 2011

В 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, но для этого быстрого и грязного примера я не использовал его.

1 голос
/ 23 марта 2011

в питоне ...

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...