2013-01-17 5 views
5

मैं XML::Twig पर नया हूं। स्टार्ट-टैग और एंड-टैग कॉम्बो (<foo></foo>) के बजाय खाली-तत्व टैग (<foo/>) का उपयोग करने के लिए मैं सभी रिक्त तत्वों को कैसे बदल सकता हूं?रिक्त-तत्व टैग का उपयोग करने के लिए XML को कैसे बदलें?

इनपुट:

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

मैं उत्पादन की जरूरत के रूप में:

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

मैंने कोशिश की:

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

लेकिन मैं इसे संसाधित नहीं कर सकता। रिक्त टैग पर सामग्री टैग के बिना gloabally कैसे बदल सकते हैं? मैं कैसे बदल सकता हूँ?

+3

'

' और '

'एक ही डेटा के अलग-अलग प्रतिनिधित्व हैं। इससे कोई फर्क क्यों पड़ता है कि आप किस का उपयोग करते हैं? – Quentin

+0

मैं अवांछित बंद करने और फ़ाइल आकार को कम करने के लिए बहुत सारे उद्देश्य को हटा देता हूं .. इसके उपयोग के लिए ... – user1811486

उत्तर

2

आप टहनी के साथ रहना चाहते हैं, आप इसे इस तरह कर सकते हैं:

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

मूल रूप से आप मैन्युअल रूप से जाँच करने के लिए करता है, तो तत्व कुछ भी नहीं होता है, तो एक खाली तत्व होने के लिए यह निर्धारित किया है।

5

एक्सएमएल :: LibXML स्वचालित रूप से छोटे संस्करण को आउटपुट करेगा।

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

एक्सएमएल के रूप में :: टहनी, यह भी डिफ़ॉल्ट (empty_tags => 'normal') द्वारा छोटे रूप का उपयोग करता है। हालांकि, यह केवल खाली तत्वों को मानता है जो <foo/> से बनाए गए थे। (मुझे बहुत बेवकूफ़ लगता है!) मैंने कुछ खुदाई की और पाया कि यह आपको तत्व को खाली या नहीं मानने पर बदलने की अनुमति देता है। यह set_empty और set_not_empty का उपयोग करके किया जाता है।

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 समाधान। – ikegami

+0

आईआईआरसी कारण खाली रिक्त तत्वों को खाली टैग के साथ बनाया गया है, यह किसी भी समय तत्व को फ्लश करना आसान बनाता है (प्रारंभ टैग को पार्स करने के बाद भी सही)। चूंकि ओपी क्या मांगता है वह काफी असामान्य है, और एक्सएमएल-वार में बहुत रुचि नहीं है, एक्सएमएल :: ट्विग इसे "आसानी से" का समर्थन नहीं करता है। ऐसा लगता है कि उपयोगकर्ता आउटपुट एक्सएमएल को यथासंभव इनपुट के करीब रखना चाहते हैं, जो एक्सएमएल :: ट्विग डिफ़ॉल्ट रूप से करता है। – mirod

+0

@mirod, या तो आप तत्व का निरीक्षण कर रहे हैं या नहीं। जब आप इसके साथ काम करते हैं तो यह आउटपुट कैसे होता है जब इसे फ़्लश किया जा सकता है। – ikegami

संबंधित मुद्दे