2013-05-08 91 views
2

我想写一个脚本来从文本文件中读取并将其转换为基于JUnit格式的XML。类似于这样的文本文件输出:如何将柱状文本文件转换为XML?

TEST      TITLE         GROUP PRIO R-STAT R-TIME  VERDICT VERDICT-TEXT 
------------------------- ---------------------------------------- -------- ---- ------ ------------ -------- -------------------------------------------------- 
Telex      Telex type        GROUP1 1 PASS 00:00:02.914 PASS  Over 
Time      Timer         GROUP2 1 PASS 00:00:06.619 PASS  Over 

这是我期待上面的文本文件输出:

<?xml version="1.0" encoding="utf-8"?> 
<testsuites name="HostTests for Character" tests="TestSuite" time=""> 
<testsuite name="GROUP1" package="GROUP1" tests="" errors=""> 
<testcase classname="GROUP1.Telex" name="Telex type" time="" status=""> 
    <skipped/> 
      <error message="" type=""/> 
    <failure message="" type=""/> 
    <system-out/> 
      <system-err/> 
     <testcase/> 
<testcase classname="GROUP2.Time" name="Timer" time="" status=""> 
    <skipped/> 
      <error message="" type=""/> 
    <failure message="" type=""/> 
    <system-out/> 
      <system-err/> 
<testcase/> 
<textsuite/> 
<testsuites/> 

如何我写一个Perl脚本在詹金斯执行此?

我也试过:

#!/usr/bin/perl 
use strict; 
use warnings; 

my $parser = XML::LibXML->new(); 
my $xslt = XML::LibXSLT->new(); 
my $textroot = $xslt ->parse_verdict_file("\\\~/jenkins/workspace/HostTestOAM/trunk/nash/test/regression/logs/verdict.1.txt"); 

my $checker = 1; 
my @txtfile = logj('logs/verdict*.txt'); 
foreach (@txtfile){ 
my $txtfile = $_; 
$txtfile =~ s/([()])/\\$1/g; 
$txtroot2 = "\\\~/jenkins/workspace/HostTestOAM/trunk/nash/test/regression/logs/$txtfile"; 

my $source = $parser->parse_file($txtroot2); 
    my $results = $textroot->transform($source); 

my $xmlparsed = "\\\~/jenkins/workspace/HostTestOAM/trunk/nash/test/regression/logs/results$checker.xml"; 

unless(open FILE, '>'.$xmlparsed) { 
die "\Creating failed\n"; 
} 

$textroot -> output_file($results, FILE); 
close FILE; 
$checker++; 
} 
+0

您需要提供某种您试图实施的代码。人们不会为你做这件事。我明白,如果你不知道自己在做什么,这可能会很困难,但从一个基本的例子开始,继续前进。 – 2013-05-08 06:31:22

+0

我很抱歉我的错误。下面是我试过的代码: – 2013-05-08 07:01:55

+0

我编辑上面史蒂夫:) – 2013-05-08 07:13:07

回答

0

在我看来,你需要做的是建立您希望您的XML寻找一个模板,并把在占位符,可以改变位。说,

my $template = '<testsuite name="XXXGROUPXXX" package="XXXGROUPXXX" tests="" errors=""> 
<testcase classname="XXXGROUPXXX.XXXTESTXXX" name="XXXTITLEXXX" time="" status="">'; 

接下来,你必须阅读你的表格数据文件,这在Perl中很容易:通常的习惯用法。 (为了节省时间,我在这里不写Perl的语法Perl ...)

open(IN, $file); 
while ($line = <IN>) 
{ 
    chomp($line); 
    # skip noise, blanks: next if (blah) 
    # Now split the line into fields so you can extract what you need 
    ($test, $title, $group, $the_rest) = split($line); 

    # and substitute the values read for test, title, group into a template 
    # rinse and repeat; 
    ($foo = $template) =~ s/XXXGROUPXXX/$group); 


    #print the new text out 
    print $foo; 
} 
close(IN); 
+0

那是个好方法,那我该如何解析它到XML文件呢? – 2013-05-22 16:22:26

0

现在我试了另一种方式,我认为它是好的。下面是代码行:

#!/usr/bin/perl 
use strict; 
use warnings; 
use XML::Writer; 
use XML::Simple; 

my $file = 'logs/verdict*.txt'; 

my %testsuite = (testcase => [ 
{classname => 'CELL.NbapCellDelete', name => 'Cell deletion', time => '%file',   status => '%file'},] 
); 
my $xmlObj = XML::Simple->new(RootName => 'testsuite'); 
print $xmlObj->XMLout (\%testsuite, noattr => 1, xmldecl => => '<?xml version="1.0"  encoding="UTF-8"?>'); 

的问题是在时间和状态,我的想法是创建一个动态数组或动态哈希存储时间和状态进入,然后将它们推到XML文件中,也许比较之间的值即动态数组和变量。能否请你帮忙?