2015-05-18 4 views
9

मेरे पास एक्सएमएल फाइलों का संग्रह है, और उनमें से कुछ बहुत बड़े हैं (~ 50 मिलियन तत्व नोड्स तक)। मैं उन फ़ाइलों को मान्य करने के लिए xmllint का उपयोग कर रहा हूं, जो स्ट्रीमिंग एपीआई के लिए बहुत बड़े लोगों के लिए भी बहुत अच्छी तरह से काम करता है।विशाल एक्सएमएल फाइलों में कमांड लाइन XPath क्वेरी कैसे करें?

xmllint --loaddtd --stream --valid /path/to/huge.xml 

मैं हाल ही में पता चला कि xmllint भी कमांड लाइन XPath प्रश्नों, जो बहुत आसान है करने में सक्षम है।

xmllint --loaddtd --xpath '/root/a/b/c/text()' /path/to/small.xml 

हालांकि, ये XPath प्रश्न विशाल XML फ़ाइलों के लिए काम नहीं करते हैं। मुझे कुछ समय बाद "हत्या" संदेश मिलता है। मैंने स्ट्रीमिंग एपीआई को सक्षम करने की कोशिश की, लेकिन इससे कोई आउटपुट नहीं हुआ।

xmllint --loaddtd --stream --xpath '/root/a/b/c/text()' /path/to/huge.xml 

वहाँ जब xmllint का उपयोग कर XPath प्रश्नों कर स्ट्रीमिंग मोड सक्षम करने के लिए एक रास्ता है? क्या विशाल एक्सएमएल फाइलों के लिए कमांड लाइन XPath क्वेरी करने के लिए अन्य/बेहतर तरीके हैं?

+0

कोशिश 'इंटरैक्टिव के लिए --shell' विकल्प (सिर्फ xml फ़ाइल पथ के साथ) – flafoux

+0

मैं एक बड़ी फ़ाइल के लिए इंटरैक्टिव खोल खोलने की कोशिश की, लेकिन यह (" मार डाला "बस के रूप में दुर्घटना होगा, इससे पहले कि मैं कोई आदेश दर्ज कर सकूं, '--stream' का उपयोग न करने का मामला)। – MRA

+0

http://superuser.com/questions/543881/efficiently-extracting-a-few-data-from-a-large-xml-file –

उत्तर

3

यदि आपका XPath अभिव्यक्ति बहुत सरल है, तो xmlcutty आज़माएं।

मुख्यपृष्ठ से:

xmlcutty बड़े एक्सएमएल फाइल से तत्वों नक्काशी, तेजी के लिए एक सरल उपकरण है। चूंकि यह एक स्ट्रीमिंग फैशन में काम करता है, यह लगभग कोई स्मृति का उपयोग नहीं करता है और लगभग 1 जी एक्सएमएल प्रति मिनट की प्रक्रिया कर सकता है।

+1

'xmllint --loaddtd --xpath'/root/a/b/c/text() '/ path/to/small.xml' जैसे कमांड का अनुवाद' xmlcutty -path '/ root/a/b में किया जाएगा/c '-rename' \ n '/ path/to/small.xml' - जहां * नाम बदलें * अंतिम संलग्न तत्व का नाम बदलने के लिए है - और इस प्रकार' टेक्स्ट() '- सिंटैक्स को अनुकरण करना थोड़ा आर्केन है। – miku

-1

परिवर्तन ulimits काम कर सकता है। इस प्रयास करें:

$ ulimit -Sv 500000 
$ xmllint (...your command) 
संबंधित मुद्दे