2009-09-08 74 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;