Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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_Shell - Fatal编程技术网

如何以编程方式在一行中获取xml的开始和结束标记?

如何以编程方式在一行中获取xml的开始和结束标记?,xml,perl,shell,Xml,Perl,Shell,我有一个xml文件,如下所示: <tr> <td>data1</td> <td>data2</td> </tr> 数据1 数据2 我想在一行中显示tr标记: <tr><td>data1</td><td>data2</td></tr> data1data2 我还希望这对xml文件中的每个tr标记都有效。 请帮忙 编辑了原始问题 简单:

我有一个xml文件,如下所示:

<tr>
   <td>data1</td>
   <td>data2</td>
</tr>

数据1
数据2
我想在一行中显示tr标记:

<tr><td>data1</td><td>data2</td></tr>
data1data2
我还希望这对xml文件中的每个tr标记都有效。 请帮忙


编辑了原始问题

简单:不要在HTML/输出中添加新行

简单:不要在HTML/输出中添加新行

这个问题并不像看上去那么微不足道。这样做的简单程序可能如下所示:

use strict;
use warnings;

while ( my $line = <DATA> ) {
    if ( $line =~ /<tr>/ ) {
        while ( $line !~ /<\/tr>/ ) {
            chomp $line;
            $line =~ s/^\s+//;
            print $line;
            $line = <DATA>;
        }
        print "\n";
    }
    print $line;
}

__DATA__
<foo>
    foo
</foo>
<tr>
    <td>data1</td>
    <td>data2</td>
</tr>
<bar>
    bar
</bar>
使用严格;
使用警告;
while(我的$line=){
如果($line=~//){
而($line!~//){
chomp$行;
$line=~s/^\s+/;
打印$行;
$line=;
}
打印“\n”;
}
打印$行;
}
__资料__
福
数据1
数据2
酒吧

但这只在文件的格式有利于程序且相关标记没有嵌套的情况下才有效。我建议您研究XML解析器,并为此编写一个定制的漂亮打印机。一个起点可以是研究模块
XML::Parser

这个问题并不像看上去那么简单。这样做的简单程序可能如下所示:

use strict;
use warnings;

while ( my $line = <DATA> ) {
    if ( $line =~ /<tr>/ ) {
        while ( $line !~ /<\/tr>/ ) {
            chomp $line;
            $line =~ s/^\s+//;
            print $line;
            $line = <DATA>;
        }
        print "\n";
    }
    print $line;
}

__DATA__
<foo>
    foo
</foo>
<tr>
    <td>data1</td>
    <td>data2</td>
</tr>
<bar>
    bar
</bar>
使用严格;
使用警告;
while(我的$line=){
如果($line=~//){
而($line!~//){
chomp$行;
$line=~s/^\s+/;
打印$行;
$line=;
}
打印“\n”;
}
打印$行;
}
__资料__
福
数据1
数据2
酒吧

但这只在文件的格式有利于程序且相关标记没有嵌套的情况下才有效。我建议您研究XML解析器,并为此编写一个定制的漂亮打印机。一个起点可以是研究模块
XML::Parser

,您可以使用XML::Twig:

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

XML::Twig->new( keep_spaces => 1,  # keep the original formating
                                   # but remove text in tr (ie whitespace)
                twig_handlers => { tr => sub { $_->cut_children( '#TEXT') } }
              )
         ->parse( \*DATA)
         ->print;

__DATA__
<html>
  <head><title>a title</title></head>
  <body>
    <h1>example data</h1>
    <table>
      <tr>
         <td>data1</td>
         <td>data2</td>
      </tr>
      <tr>
         <td>data1</td>
         <td>data2</td>
      </tr>
    </table>
  </body>
</html> 
#/usr/bin/perl
严格使用;
使用警告;
使用XML::Twig;
XML::Twig->new(保留空格=>1,#保留原始格式
#但删除tr中的文本(即空格)
细枝处理程序=>{tr=>sub{$\->cut_子对象('#TEXT')}
)
->解析(\*数据)
->印刷品;
__资料__
头衔
示例数据
数据1
数据2
数据1
数据2

您可以使用XML::Twig:

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

XML::Twig->new( keep_spaces => 1,  # keep the original formating
                                   # but remove text in tr (ie whitespace)
                twig_handlers => { tr => sub { $_->cut_children( '#TEXT') } }
              )
         ->parse( \*DATA)
         ->print;

__DATA__
<html>
  <head><title>a title</title></head>
  <body>
    <h1>example data</h1>
    <table>
      <tr>
         <td>data1</td>
         <td>data2</td>
      </tr>
      <tr>
         <td>data1</td>
         <td>data2</td>
      </tr>
    </table>
  </body>
</html> 
#/usr/bin/perl
严格使用;
使用警告;
使用XML::Twig;
XML::Twig->new(保留空格=>1,#保留原始格式
#但删除tr中的文本(即空格)
细枝处理程序=>{tr=>sub{$\->cut_子对象('#TEXT')}
)
->解析(\*数据)
->印刷品;
__资料__
头衔
示例数据
数据1
数据2
数据1
数据2

介于完全幼稚和真实解析器之间的解决方案:

$xmlConetnts =~ s/\>\s*\n\s*\</></g;

$xmlcontents=~s/\>\s*\n\s*\newline一个介于完全原始和真实解析器之间的解决方案:

$xmlConetnts =~ s/\>\s*\n\s*\</></g;

$xmlcontents=~s/\>\s*\n\s*\newline谢谢您的回答,但是xml标记呢?我的意思是,如果我正在处理一个具有自定义标记的xml文件,该怎么办?然后,按照这个答案得出逻辑结论:“不要在xml/输出中添加新行”。这并不是很有帮助,因为这个答案并没有解决“如何以编程方式在开始和结束
标记对之间删除新行?”的问题,这就是我对原始问题的解释。@Quentin:你说得对!谢谢你的回答,但是xml标记呢?我的意思是,如果我正在处理一个具有自定义标记的xml文件呢?然后,按照这个答案得出逻辑结论:“不要在xml/输出中添加新行”。这并不是很有帮助,因为这个答案并没有解决“如何以编程方式在开始和结束
标记对之间删除新行?”的问题,这就是我对原始问题的解释。@Quentin:你说得对!不过,它会在任何地方删除换行符,而不仅仅是在td'strue之间-根据需要修改它,比如replace
td>\n\n\n但是如果tr有属性,那么第二个regexp将不再工作。哦,不,
s{(tr[^>]*>)\s*\n\s*(确实如此。这只适用于非常简单的情况。可能足以一次性使用,当然不适用于实际使用。但它会在任何地方删除换行符,而不仅仅是在td'strue之间-根据需要修改它,比如说替换
td>\n\n\n但是如果tr具有属性,那么第二个regexp将不再工作。哦,不,
s{(tr[^>]*>)\s*\n\n*(事实上,这只适用于非常简单的情况。可能足以一次性使用,当然不适用于现实世界。这“不是一个真正的问题”到底是怎么回事?这可能不是一个非常有趣的问题,但却是一个问题。这“不是一个真正的问题”到底是怎么回事?这可能不太有趣,但却是个问题。