मैं XML::Twig
उपयोग कर रहा हूँ एक बहुत बड़ी XML दस्तावेज के माध्यम से पार्स करने के लिए तेजी लाने के कर सकते हैं। मैं <change></change>
टैग के आधार पर इसे टुकड़ों में विभाजित करना चाहता हूं।मैं कैसे एक्सएमएल :: टहनी
अभी मेरे पास है:
my $xml = XML::Twig->new(twig_handlers => { 'change' => \&parseChange, });
$xml->parsefile($LOGFILE);
sub parseChange {
my ($xml, $change) = @_;
my $message = $change->first_child('message');
my @lines = $message->children_text('line');
foreach (@lines) {
if ($_ =~ /[^a-zA-Z0-9](?i)bug(?-i)[^a-zA-Z0-9]/) {
print outputData "$_\n";
}
}
outputData->flush();
$change->purge;
}
अभी इस parseChange
विधि चल रहा है जब यह एक्सएमएल से कि ब्लॉक खींचती है। यह बहुत धीमी गति से चल रहा है। मैंने $/=</change>
वाली फ़ाइल से एक्सएमएल पढ़ने और एक्सएमएल टैग की सामग्री को वापस करने के लिए एक फ़ंक्शन लिखने के खिलाफ इसका परीक्षण किया और यह बहुत तेज हो गया।
वहाँ कुछ मैं याद कर रहा हूँ या मैं XML::Twig
गलत तरीके से उपयोग कर रहा हूँ है? मैं पर्ल के लिए नया हूँ।
संपादित करें: यहाँ परिवर्तन फ़ाइल से एक उदाहरण परिवर्तन है। फ़ाइल के बाद इन एक सही का एक बहुत होते हैं और उन दोनों के बीच में कुछ भी नहीं होना चाहिए:
<change>
<project>device_common</project>
<commit_hash>523e077fb8fe899680c33539155d935e0624e40a</commit_hash>
<tree_hash>598e7a1bd070f33b1f1f8c926047edde055094cf</tree_hash>
<parent_hashes>71b1f9be815b72f925e66e866cb7afe9c5cd3239</parent_hashes>
<author_name>Jean-Baptiste Queru</author_name>
<author_e-mail>[email protected]</author_e-mail>
<author_date>Fri Apr 22 08:32:04 2011 -0700</author_date>
<commiter_name>Jean-Baptiste Queru</commiter_name>
<commiter_email>[email protected]</commiter_email>
<committer_date>Fri Apr 22 08:32:04 2011 -0700</committer_date>
<subject>chmod the output scripts</subject>
<message>
<line>Change-Id: Iae22c67066ba4160071aa2b30a5a1052b00a9d7f</line>
</message>
<target>
<line>generate-blob-scripts.sh</line>
</target>
</change>
मुझे नहीं लगता कि एक्सएमएल :: ट्विग' पर जाने से पहले एक्सएमएल को रेगेक्स के साथ प्री-प्रोसेस करना अच्छा विचार है। यह आपके कोड को बहुत कम मजबूत बनाता है। क्या होगा यदि एक टिप्पणी के भीतर ' 'है, उदाहरण के लिए? साथ ही, यह असंभव है कि एक्सएमएल पार्सिंग आपकी स्क्रिप्ट को धीमा करने वाली चीज है। क्या आप अधिक जानकारी दे सकते हैं: फ़ाइल का आकार और आप किस प्रकार की प्रसंस्करण कर रहे हैं? – dan1111
मैं फिलहाल कहीं भी रेगेक्स का उपयोग नहीं कर रहा हूं। एक विधि टहनियों का उपयोग कर रही थी और दूसरा इसे पढ़ रहा था और इसे स्वयं पार्स कर रहा था। मैंने इस टुकड़े को समग्र लिपि से निकाला है, इसलिए यह एकमात्र चीज है जो चल रही है। इसके अलावा, फ़ाइल का आकार 2.3 जीबी है। मैं एक्सएमएल से डेटा निकाल रहा हूं और इसमें से कुछ को हैश में जोड़ रहा हूं। – user1897691
क्षमा करें, यह "regex" कहने की गलती थी। मेरा मतलब था कि यदि आप इसे पार्स करने से पहले कुछ नियम (जैसे लाइन विभाजक) का उपयोग कर फ़ाइल तोड़ते हैं, तो आप एक्सएमएल की अखंडता को तोड़ सकते हैं। आपकी एक्सएमएल फाइल कितनी बड़ी है? – dan1111