2010-08-09 9 views
10

एलिमेंट ट्री का उपयोग करते हुए पायथन 2.6 में, किसी विशेष तत्व के अंदर एक्सएमएल (एक स्ट्रिंग के रूप में) लाने का एक अच्छा तरीका क्या है, जैसे आप एचटीएमएल और जावास्क्रिप्ट में innerHTML के साथ क्या कर सकते हैं ?पायथन और एलिमेंट ट्री: मूल तत्व को छोड़कर "आंतरिक एक्सएमएल" वापस करें

This is some text <a href="foo.htm">and a link</a> in embedded HTML 

मैं कोशिश की है माता पिता से अधिक पुनरावृत्ति:

<label attr="foo" attr2="bar">This is some text <a href="foo.htm">and a link</a> in embedded HTML</label> 

मैं इस तार के साथ खत्म करना चाहते हैं:

यहाँ एक्सएमएल नोड के एक सरल नमूना मैं के साथ शुरू कर रहा हूँ है नोड और बच्चों की tostring() श्रृंखलाबद्ध, लेकिन वह मुझे दिया ही subnodes:

# returns only subnodes (e.g. <a href="foo.htm">and a link</a>) 
''.join([et.tostring(sub, encoding="utf-8") for sub in node]) 

मैं नियमित अभिव्यक्ति का उपयोग कर एक समाधान ऊपर हैक कर सकते हैं, लेकिन उम्मीद थी वहाँ कम hacky कुछ इस से होगी:

re.sub("</\w+?>\s*?$", "", re.sub("^\s*?<\w*?>", "", et.tostring(node, encoding="utf-8"))) 

उत्तर

8

का उपयोग कैसे के बारे में:

from xml.etree import ElementTree as ET 

xml = '<root>start here<child1>some text<sub1/>here</child1>and<child2>here as well<sub2/><sub3/></child2>end here</root>' 
root = ET.fromstring(xml) 

def content(tag): 
    return tag.text + ''.join(ET.tostring(e) for e in tag) 

print content(root) 
print content(root.find('child2')) 

में परिणामी:

start here<child1>some text<sub1 />here</child1>and<child2>here as well<sub2 /><sub3 /></child2>end here 
here as well<sub2 /><sub3 /> 
1

मेरे लिए काम किया है:

from xml.etree import ElementTree as etree 
xml = '<root>start here<child1>some text<sub1/>here</child1>and<child2>here as well<sub2/><sub3/></child2>end here</root>' 
dom = etree.XML(xml) 

(dom.text or '') + ''.join(map(etree.tostring, dom)) + (dom.tail or '') 
# 'start here<child1>some text<sub1 />here</child1>and<child2>here as well<sub2 /><sub3 /></child2>end here' 

dom.text or '' प्राप्त करने के लिए प्रयोग किया जाता है root तत्व की शुरुआत में पाठ। यदि dom.text कोई पाठ नहीं है None है।

ध्यान दें कि परिणाम वैध XML नहीं है - एक वैध एक्सएमएल में केवल एक मूल तत्व होना चाहिए।

ElementTree docs about mixed content पर एक नज़र डालें।


पायथन 2.6.5, उबंटू 10.04

+0

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

+0

करीब ... लेकिन etree.tostring() में प्रत्येक उपखंड की पूंछ शामिल नहीं है। और मुझे लगता है कि अंतिम dom.tail की आवश्यकता नहीं है क्योंकि यह * तत्व * के बाद स्ट्रिंग है और इसके अंदर नहीं है। –

+0

मुझे आपको जस्टिन समझ में नहीं आता है - 'यहां प्रारंभ करें', और 'और' यहां समाप्त 'एक पाठ है जो मूल तत्व के अंदर सही है ?! उपरोक्त स्निपेट को कुछ झुकाव की आवश्यकता हो सकती है - आप कुछ परीक्षण केस बना सकते हैं और इसे बेहतर बना सकते हैं - मिश्रित सामग्री को संभालने के तरीके पर दस्तावेज़ के लिए लिंक देखें। –

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