如何使用Perl将XML处理指令转换为标记?

时间:2009-09-08 05:38:33

标签: xml perl

如何使用Perl将处理指令元素转换为普通的XML元素?

例如:

<?legalnoticestart?>
<?sourcenotestart?>
<para>Content para</para>
<?sourcenoteend?>
<?literallayoutstart?>
<?literallayoutend?>
<?literallayoutend?>
<?legalnoticeend?>

所需格式:

<legalnotice>
<sourcenote>
<p>Content para</p>
</sourcenote>
<literallayout>
<p>body content</p>
</literallayout>
</legalnotice>

请使用Perl脚本给我任何解决方案?

代码将不胜感激。

最诚挚的问候, 安东尼

2 个答案:

答案 0 :(得分:3)

奇怪的是,我会使用XML::Twig

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

XML::Twig->new( twig_roots => { '#PI' => \&out_pi, },
                twig_print_outside_roots => 1,
              )
         ->parsefile( 'pi2elt.xml')
         ;

sub out_pi
  { my( $t, $pi)= @_;
    my $target= $pi->target;
    $target=~ s{^(.*)start$}{$1};
    $target=~ s{^(.*)end$}{/$1};
    print "<$target>";
  }

这将遍历文件,仅处理PI(twig_roots选项)并输出其余的(twig_print_outside_roots选项)。

一些警告:您的输入文件需要是有效的XML,因此它必须是UTF-8或UTF-16,或者具有指定其编码的XML声明。也没有检查输出是否是有效的XML,您可以使用任何适当的XML解析器检查输出。

答案 1 :(得分:-1)

这是我的解决方案(基于正则表达式):

my $string = <<TEXT;
<?legalnoticestart?>
<?sourcenotestart?>
<para>Content para</para>
<?sourcenoteend?>
<?literallayoutstart?>
<?literallayoutend?>
<?literallayoutend?>
<?legalnoticeend?>';
TEXT

$string =~ s!<\?([^\?]+)start\?>!<\1>!g;
$string =~ s!<\?([^\?]+)end\?>!</\1>!g;
print $string;