Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将柱状文本文件转换为XML?_Xml_Perl_Jenkins Plugins_Text Processing - Fatal编程技术网

如何将柱状文本文件转换为XML?

如何将柱状文本文件转换为XML?,xml,perl,jenkins-plugins,text-processing,Xml,Perl,Jenkins Plugins,Text Processing,我正在尝试编写一个脚本,从文本文件中读取并基于JUnit格式将其转换为XML。文本文件输出与此类似: TEST TITLE GROUP PRIO R-STAT R-TIME VERDICT VERDICT-TEXT ------------------------- ---------------------------------------- --------

我正在尝试编写一个脚本,从文本文件中读取并基于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/> 

在我看来,您需要做的是为XML的外观构建一个模板,并为可能发生变化的位添加占位符。说

my $template = '<testsuite name="XXXGROUPXXX" package="XXXGROUPXXX" tests="" errors="">
<testcase classname="XXXGROUPXXX.XXXTESTXXX" name="XXXTITLEXXX" time="" status="">';
my$template='1〕
';
接下来,您必须读入表格数据文件,这在Perl中很容易:通常的习惯用法。(为了节省时间,我不在这里写语法Perl…)

打开(在$file中);
而($line=)
{
chomp($line);
#跳过噪音,空白:下一个if(废话)
#现在将行拆分为字段,以便提取所需内容
($test、$title、$group、$the_rest)=拆分($line);
#并将为test、title、group读取的值替换为模板
#冲洗并重复;
($foo=$template)=~s/XXXGROUPXXX/$group);
#打印新文本
打印$foo;
}
关闭(IN);

现在我尝试了另一种方法,我认为它很好。以下是代码行:

#!/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"?>');
#/usr/bin/perl
严格使用;
使用警告;
使用XML::Writer;
使用XML::Simple;
my$file='logs/verdict*.txt';
我的%testsuite=(testcase=>[
{classname=>'CELL.NbapCellDelete',name=>'CELL deletion',time=>'%file',status=>'%file'},]
);
我的$xmlObj=XML::Simple->new(RootName=>testsuite);
打印$xmlObj->XMLout(\%testsuite,noattr=>1,xmldecl=>;

问题是时间和状态,我的想法是创建一个动态数组或动态哈希来存储时间和状态,然后将它们放入xml文件中,可能会比较动态数组和变量之间的值。您能帮忙吗?

您需要提供一些您试图实现的代码。人们不会只为你做这件事。我明白,如果你不知道自己在做什么,这可能会很困难,但从一个基本的例子开始,然后逐步提高。我为我的错误感到抱歉。下面是我尝试过的代码:我在上面编辑过Steve:)为什么要使用XML解析器?您只需要解析文本文件,然后就可以手动打印XML。我想要按照此链接中的格式打印到XML文件,您的意思是有手动方式来执行此操作,对吗?
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);
#!/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"?>');