2012-10-26 11 views
10

मैं एक अलग तरीके से एक ईट्री (एक HTML दस्तावेज़ से गठित) की वृक्ष संरचना मुद्रित करना चाहता हूं (इसका मतलब है कि दो एट्री अलग-अलग प्रिंट करना चाहिए)।lxml (या lxml.html): प्रिंट पेड़ संरचना

संरचना से मेरा क्या मतलब है पेड़ का "आकार" है, जिसका मूल रूप से सभी टैग का मतलब है लेकिन कोई विशेषता नहीं है और कोई टेक्स्ट सामग्री नहीं है।

कोई विचार? क्या ऐसा करने के लिए एलएक्सएमएल में कुछ है?

यदि नहीं, तो मुझे लगता है कि मुझे पूरे पेड़ के माध्यम से फिर से भरना होगा और उस से एक स्ट्रिंग बनाना होगा। किसी भी विचार को एक कॉम्पैक्ट तरीके से पेड़ का प्रतिनिधित्व कैसे करें? ("कॉम्पैक्ट" सुविधा कम प्रासंगिक है)

FYI इसे देखने का इरादा नहीं है, लेकिन संग्रहीत किया जाना चाहिए और कई HTML टेम्पलेट्स के बीच अंतर बनाने में सक्षम होना चाहिए।

धन्यवाद

+2

क्या ऐसा कुछ है जो '.ostस्टिंग()' विधि आपके लिए नहीं कर रहा है? – kindall

+0

हाँ, खेद है कि यह स्पष्ट नहीं था: पेड़ की संरचना से मेरा क्या मतलब है मूल रूप से सिर्फ टैग, कोई पाठ नहीं, कोई विशेषता नहीं (प्रश्न में जोड़ा गया) – lajarre

+1

मुझे नहीं लगता कि एलएक्सएमएल में यह कार्यक्षमता अंतर्निहित है, इसलिए आपको पेड़ चलना होगा। –

उत्तर

9

हो सकता है कि बस, स्रोत XML सब कुछ है, लेकिन टैग पट्टी पर कुछ XSLT चलाने यह तो बहुत आसान etree.tostring उपयोग करने के लिए एक स्ट्रिंग आप हैश सकता प्राप्त करने के लिए है ...

from lxml import etree as ET 

def pp(e): 
    print ET.tostring(e, pretty_print=True) 
    print 

root = ET.XML("""\ 
<project id="8dce5d94-4273-47ef-8d1b-0c7882f91caa" kpf_version="4"> 
<livefolder id="8744bc67-1b9e-443d-ba9f-96e1d0007ba8" idref="707cd68a-33b5-4051-9e40-8ba686c2fdb8">Mooo</livefolder> 
<livefolder id="8744bc67-1b9e-443d-ba9f" idref="707cd68a-33b5-4051-9e40-8ba686c2fdb8" /> 
<preference-set idref="8dce5d94-4273-47ef-8d1b-0c7882f91caa"> 
    <boolean id="import_live">0</boolean> 
</preference-set> 
</project> 
""") 
pp(root) 


xslt = ET.XML("""\ 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="*"> 
    <xsl:copy> 
     <xsl:apply-templates select="*"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
""") 
tr = ET.XSLT(xslt) 

doc2 = tr(root) 
root2 = doc2.getroot() 
pp(root2) 

देता है आप आउटपुट:

<project id="8dce5d94-4273-47ef-8d1b-0c7882f91caa" kpf_version="4"> 
    <livefolder id="8744bc67-1b9e-443d-ba9f-96e1d0007ba8" idref="707cd68a-33b5-4051-9e40-8ba686c2fdb8">Mooo</livefolder> 
    <livefolder id="8744bc67-1b9e-443d-ba9f" idref="707cd68a-33b5-4051-9e40-8ba686c2fdb8"/> 
    <preference-set idref="8dce5d94-4273-47ef-8d1b-0c7882f91caa"> 
    <boolean id="import_live">0</boolean> 
    </preference-set> 
</project> 

<project> 
    <livefolder/> 
    <livefolder/> 
    <preference-set> 
    <boolean/> 
    </preference-set> 
</project> 
+0

निश्चित रूप से मुझे एक्सएसएलटी के बारे में बहुत कुछ नहीं पता था और यह मुझे लगता है कि – lajarre

+0

करने का सही और मानक तरीका प्रतीत होता है। एक बार जब आप इसकी आदत में आ जाएंगे तो यह वास्तव में कुछ भी उपयोगी है जहां आप बहुत सारी संरचनाओं से शुरू करते हैं और चाहते हैं इसे और अधिक प्रबंधनीय में बदल दें। बस याद रखें कि डिफ़ॉल्ट नियम इस स्टाइलशीट के समान हैं - http://pastebin.com/b3WHMjPx - इसलिए यह तत्वों और विशेषताओं की प्रतिलिपि बनाता है, लेकिन कुछ भी नहीं। – spiralx

+1

इस जगह में एक बहुत अच्छा ट्यूटोरियल है, और यहां तक ​​कि सभी चीजों के लिए बेहतर संदर्भ सामग्री XML: http://zvon.org/comp/m/tutorial.html – spiralx