【问题标题】:How to get opening and closing tags of xml in one line programmatically? [closed]如何以编程方式在一行中获取xml的开始和结束标签? [关闭]
【发布时间】:2012-08-13 19:26:51
【问题描述】:

我有一个xml文件如下:

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

我想在一行中显示tr标签:

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

我还希望这适用于 xml 文件中的每个 tr 标签。 请帮忙。

编辑了原始问题。

【问题讨论】:

标签: xml perl shell


【解决方案1】:

你可以用 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> 

【讨论】:

    【解决方案2】:

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

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

    这会将&gt; newline &lt; 替换为&gt;&lt;

    由于 XML 不允许在文本数据中使用 &lt;,因此除非您有 CDATA 部分,否则您应该是安全的。

    【讨论】:

    • 它会在所有地方删除换行符,而不仅仅是在 td 之间
    • true - 根据需要修改它,比如替换 td&gt;\n&lt;tdtr&gt;\n&lt;tdtd&gt;\n&lt;/tr
    • 但是如果一个 tr 有属性,你的第二个正则表达式就不再起作用了。哦,不,s{(tr[^&gt;]*&gt;)\s*\n\s*(&lt;td)}{$1$2} 也不起作用,因为您可以在属性值中包含 &gt;... 而这种方式就是疯狂...
    • 确实如此。这仅适用于非常简单的情况。一次性使用可能就足够了,当然不适合现实世界使用。
    【解决方案3】:

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

    【讨论】:

    • 谢谢你的回答,但是xml标签呢?
    • 我的意思是,如果我正在处理具有自定义标签的 xml 文件怎么办?
    • 然后,按照这个答案得出其合乎逻辑的结论:“不要在您的 XML/输出中添加新行”。这并不是很有帮助,因为这个答案没有解决“如何以编程方式删除开始和结束 &lt;tr&gt; 标签对之间的新行?”的问题,这就是我将原始问题解释为。
    • @Quentin:你是对的!
    【解决方案4】:

    这个问题并不像看起来那么简单。执行此操作的简单程序可能如下所示:

    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>
    

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

    【讨论】:

      猜你喜欢
      • 2014-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      相关资源
      最近更新 更多