2012-05-12 7 views
5

क्या यह ऑब्जेक्ट बनाने के लिए एलएक्सएमएल (या बिल्टिन एट्री लाइब्रेरी) का उपयोग करना संभव है जो एक्सएमएल के टुकड़े का प्रतिनिधित्व करता है, लेकिन इसमें दो (या अधिक) डिज्जॉइंट पेड़ होते हैं (यानी प्रत्येक पेड़ की अपनी अलग जड़ होती है, लेकिन वे कोई आम पूर्वज नहीं साझा करते हैं)?lxml कोई रूट तत्व के साथ एक्सएमएल खंड बनाएँ?

है, वहाँ कुछ भी है कि एक और तत्व बनाए बिना निम्नलिखित का प्रतिनिधित्व कर सकता है उन दोनों को धारण करने के लिए है:

<tree id="A"><anotherelement/></tree> 
<tree id="B"><yetanotherelement/></tree> 

मैं lxml दस्तावेज में कुछ भी है कि कि अनुमति होगी नहीं देख सकते हैं, और stackoverflow लगता है सीधे बिंदु पर कुछ भी नहीं है।

यहां उपयोग-मामला यह है कि मैं प्रोग्रामिंग रूप से एक्सएमएल उत्पन्न कर रहा हूं, और टुकड़े आउटपुट के लिए एक दस्तावेज़ में इकट्ठे किए जाएंगे। मुझे एक ऑब्जेक्ट चाहिए जो मुझे/विशेष मामले को फिर से शुरू करने की आवश्यकता नहीं है, बस lxml विधियों को पास करें जैसे कि यह एक उचित पेड़ था।

(मुझे पता है कि ऐसे टुकड़े स्वयं पूर्ण और सही XML दस्तावेज़ नहीं होंगे; मैं इस तरह के दस्तावेज़ में असेंबली से पहले मध्यवर्ती उत्पादों को स्टोर करना चाहता हूं)।

+0

केवल एलएक्सएमएल वस्तुओं की सूची बनाने के बारे में क्या? यह आपके पास बहुत कुछ है ... – larsks

+0

@larsks दाएं, लेकिन फिर मुझे कोड लिखने की आवश्यकता है जो xml एपीआई के प्रकार की ऑब्जेक्ट को पास करने के बजाय सूची की उपस्थिति को संभालती है। इसमें मेरे कोड में या तो हमेशा एक सूची रखने के लिए विशेष-आवरण शामिल है। यही कारण है कि यह बेहतर होगा। – Marcin

उत्तर

4

हाँ, वहाँ lxml.html पैकेज में इस तरह के एक कार्यक्षमता, यह fragment_fromstring या fragments_fromstring कहा जाता है है, लेकिन ज्यादातर मामलों में HTML पार्सर भी एक्सएमएल संभालती है बहुत अच्छी तरह से:

from lxml import etree, html 

xml = """ 
    <tree id="A"><anotherelement/></tree> 
    <tree id="B"><yetanotherelement/></tree> 
""" 

fragments = html.fragments_fromstring(xml) 

root = etree.Element("root") 
for f in fragments: 
    root.append(f) 

print etree.tostring(root, pretty_print=True) 

उत्पादन:

<root> 
    <tree id="A"> 
    <anotherelement/> 
    </tree> 
    <tree id="B"> 
    <yetanotherelement/> 
    </tree> 
</root> 

यदि आप what's going on under the hood देखते हैं, तो शायद आपको अन्य परिणाम से खुश नहीं होने पर एक्सएमएल पार्सर का उपयोग करना बहुत मुश्किल नहीं होगा।

+0

इसके लिए धन्यवाद। मैं वास्तव में टुकड़े प्रोग्रामेटिक रूप से बनाना चाहता हूं, इसलिए मैं हुड के नीचे देखूंगा। – Marcin

+0

आह, यह अभी भी एक सूची लौटाता है - मैं उम्मीद कर रहा था कि ऐसी वस्तु बनाने का एक तरीका होगा जिसे मुझे/विशेष मामले को फिर से शुरू करने की आवश्यकता नहीं है, बस एलएक्सएमएल विधियों को पास करें जैसे कि यह एक उचित पेड़ था। मैं अगले कुछ दिनों में यह जवाब स्वीकार करूंगा, मान लीजिए कि किसी और को कुछ जादू विधि के बारे में पता नहीं है। – Marcin

+0

+1 लेकिन यह जानना निश्चित रूप से महत्वपूर्ण है कि 'fragments_fromstring()' एक सूची देता है और 'fragment_fromstring()' केवल एक तत्व को छोड़कर ही होगा – JCotton