2013-06-05 42 views
4

我選擇性地修復了一些元素和屬性。不幸的是,我們的輸入文件包含單引號和雙引號屬性值。另外,一些屬性值包含引號(在一個值內)。Perl XML :: Twig - 在屬性中和附近保留引號

使用XML :: Twig,我看不出如何保留屬性值周圍的任何引號。

這裏的示例代碼:

use strict; 
use XML::Twig; 

my $file=qq(<file> 
    <label1 attr='This "works"!' /> 
    <label2 attr="This 'works'!" /> 
</file> 
); 

my $fixes=0; # count fixes 
my $twig = XML::Twig->new(twig_handlers => { 
          '[@attr]' => sub {fix_att(@_,\$fixes);} }, 
          # ... 
          keep_atts_order => 1, 
          keep_spaces => 1, 
          keep_encoding => 1,); 
#$twig->set_quote('single'); 

$twig->parse($file); 
print $twig->sprint(); 

sub fix_att { 
    my ($t,$elt,$fixes) [email protected]_; 
    # ... 
} 

上面的代碼返回無效的XML爲LABEL1:

<label1 attr="This "works"!" /> 

如果我添加:

$twig->set_quote('single'); 

然後我們會看到LABEL2無效的XML :

<label2 attr='This 'works'!' /> 

是否有保留現有報價的選項?或者有更好的方法選擇性固定小枝?

+0

將你的'XML :: Twig'版本從3.37更新到最新的CPAN(3.44)。如果您仍然看到此問題,請將其報告爲CPAN上的錯誤。 – toolic

+0

問題在3.44中依然存在。作爲一種解決方法,我添加了一個額外的twig_handler來將屬性值中的所有雙引號更改爲單引號:''*'=> sub {my($ t,$ elt)= @ _; foreach(keys%{$ elt-> atts}){$ {$ elt-> atts} {$ _} =〜s/\「/ \'/ g;}},' – ALF

回答

1

是否有任何具體原因讓您使用keep_encoding?沒有它,報價是正確的編碼。

keep_encoding用於保留文件的原始編碼,但還有其他方法可以執行此操作。它主要用於5.8之前的版本,當時編碼工作並不像現在這樣順利。

+0

我確實需要保留原始編碼。Mirod,你能否提出一種替代方法來保存編碼?謝謝。 – ALF

+0

嘗試做'binmode STDOUT,sprintf(「encoding(:%s)」,$ twig-> encoding);'在打印樹枝之前。將STDOUT編碼爲適當的值,然後進行測試,因爲我不能100%確定所有的XML編碼都被Perl支持。 – mirod