2013-01-17 15 views
5

XML::Twig için yeni. Bir başlangıç ​​etiketi ve bitiş etiketi birleşik (<foo></foo>) yerine boş öğe etiketlerini (<foo/>) kullanmak için tüm boş öğeleri nasıl değiştirebilirim? DenedimBoş öğe etiketlerini kullanmak için XML nasıl değiştirilir?

<book> 
    <given-names>Maurice<xref ref-type="fn" rid="fnI_1"/></given-names> 
    <colspec colname="col1" colnum="1"/> 
    <entry align="left"><p/></entry> 
</book> 

:

Girdi:

 use XML::Twig; 
     my $xml = XML::Twig->new(twig_handlers => { 
            'xref' => sub {$_->set_tag('#EMPTY'),}, 
           }, 
           pretty_print => 'indented',           
           ); 
     $xml->parse('sample.xml'); 
     $xml->print; 
} 

Ama bunu işleyemez olarak

<book> 
    <given-names>Maurice<xref ref-type="fn" rid="fnI_1"></xref></given-names> 
    <colspec colname="col1" colnum="1"></colspec> 
    <entry align="left"><p></p></entry> 
</book> 

Ben çıktı gerekir. İçerik etiketi olmadan gizlice etiketi boş etikete nasıl dönüştürebilirim? nasıl değişebilirim

+3

'

' ve '

' yalnızca aynı verilerin farklı gösterimleridir. Hangisini kullandığınız önemlidir? – Quentin

+0

İstenmeyen kapanma ve dosya boyutunu çok fazla azaltma özelliğini kaldırıyorum. Bunun için ... – user1811486

cevap

2

, bunu şöyle yapabiliriz.

5

XML :: LibXML otomatik olarak daha kısa sürüme sahip olacak.

use XML::LibXML qw(); 
print XML::LibXML->new()->parse_file($ARGV[0])->toString(); 
XML gelince

:: Twig, aynı zamanda varsayılan ( empty_tags => 'normal') tarafından kısa formu kullanır. Ancak, yalnızca <foo/>'dan oluşturulan boş öğeleri göz önünde bulundurur. (Bana çok aptalca geliyor!) Kazı yaptım ve bir elemanı boş ya da görmüyorsa değiştirmene izin verdiğini fark ettim. Bu, set_empty ve set_not_empty kullanılarak yapılır. Daha sonra,
#!usr/bin/perl 
use strict; 
use warnings; 
use XML::Twig; 

my $xml = XML::Twig->new(twig_handlers => { 
      'p' => sub { 
       if (!$_->first_child()) { $_->set_content('#EMPTY') } 
       }, 
      }, 
      pretty_print => 'indented', 
      empty_tags => 'normal'         
); 

$xml->parsefile('file.xml'); 
$xml->print; 

Temelde eleman hiçbir şey içeriyorsa elle kontrol etmek zorunda boş bir eleman olacak şekilde ayarlayın: Eğer dal ile sopa istiyorsanız

use XML::Twig qw(); 
my $twig = XML::Twig->new(
    twig_handlers => { 
     '*' => sub { 
     $_->set_empty() if !$_->first_child(); 
     }, 
    }, 
); 
$twig->parsefile($ARGV[0]); 
$twig->print(); 
+0

XML :: Twig solution. – ikegami

+0

IIRC, boş olarak kabul edilen tek unsurların, boş bir etiketle oluşturulanlar nedeni, öğeyi herhangi bir zamanda temizlemeyi kolaylaştırmaktır (başlangıç ​​etiketini ayrıştırdıktan hemen sonra). OP sorar ne kadar nadir ve XML-wise, büyük ilgi değil, çünkü XML :: Twig "kolayca" desteklemiyor. Kullanıcıların çıkış XML'lerini mümkün olduğunca girişe yakın tutmak istedikleri, yani XML :: Twig'in varsayılan olarak yaptığı şey çok daha yaygındır. – mirod

+0

@mirod, Elementi denetlemeyi bitirdiniz ya da değil. İşiniz bittiğinde çıkış nasıl yapılır, ne zaman kızardıysa fark etmez. – ikegami

İlgili konular