如何使用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脚本给我任何解决方案?
代码将不胜感激。
最诚挚的问候, 安东尼
答案 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;