2013-05-08 3 views
2

Я пытаюсь написать сценарий для чтения из текстового файла и преобразовать его в XML на основе формата JUnit. Выходной текстовый файл похож на это:Как преобразовать текстовый файл столбца в 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

Вам необходимо предоставить какой-то код, который вы пытались реализовать. Люди не собираются просто делать это за вас. Я понимаю, что это может быть сложно, если вы не знаете, что делаете, но начните с базового примера и проработайте свой путь вверх. –

+0

Прошу прощения за мою ошибку. Ниже приведен код, который я пробовал: –

+0

Я редактировал выше Steve :) –

ответ

0

Кажется мне, что то, что вам нужно сделать, это создать шаблон для того, как вы хотите, чтобы ваш XML посмотреть, и положить в заполнителей для битов, которые могут изменить. Скажем,

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

Далее, вы должны прочитать в файле табличных данных, который легко в 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-файл? –

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

Смежные вопросы