【问题标题】:Parse data from multiple XML files and output to csv file从多个 XML 文件解析数据并输出到 csv 文件
【发布时间】:2011-03-23 04:21:13
【问题描述】:

我有十几个 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

有什么好的 cygwin 命令行工具可以解析 XML 吗?或者如果失败了,在 Ruby 中有没有很好的方法来做到这一点?

【问题讨论】:

    标签: ruby xml csv cygwin


    【解决方案1】:

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

    我知道有些人觉得 XSLT 很糟糕,但我一直用它来做这种事情,而且我很喜欢它。此外,它几乎与平台无关。

    【讨论】:

      【解决方案2】:

      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 生成器/解析器,但对于这个简单粗暴的示例,我没有使用它。

      【讨论】:

        【解决方案3】:

        在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 新手,但我如何获得 elementTree 模块?我在 Windows 7 上,并且确实安装了主要的 Python 发行版。
        猜你喜欢
        • 2020-01-09
        • 1970-01-01
        • 1970-01-01
        • 2015-11-15
        • 1970-01-01
        • 2019-11-15
        • 2014-02-26
        • 2015-05-24
        • 2019-08-10
        相关资源
        最近更新 更多