2009-09-08 75 views
-2

如何使用Perl将处理指令元素转换为正常的XML元素?如何使用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

你已经尝试自己的东西吗?这是什么让你很难过? – innaM 2009-09-08 05:52:30

回答

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>"; 
    } 

这将通过文件,唯一的处理督察(该twig_roots选项)和输出其余不变( twig_print_outside_roots选项)。

一些注意事项:您的输入文件需要是有效的XML,因此它必须使用UTF-8或UTF-16格式,或者使用XML声明来指定其编码。根本没有检查输出是有效的XML,你可以用任何合适的XML解析器检查输出。

-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;