2009-06-14 12 views
11

के साथ एक डॉक्टरेट बनाना, मैं अपने एक्सएमएल दस्तावेजों में डक्टिप्प्स जोड़ना चाहता हूं जो मैं एलएक्सएमएल के एट्री के साथ उत्पन्न कर रहा हूं।एलएक्सएमएल के एट्री

हालांकि मैं यह नहीं समझ सकता कि एक डॉक्टरेट कैसे जोड़ना है। हार्डकोडिंग और स्ट्रिंग को जोड़ना एक विकल्प नहीं है।

मैं कैसे पीआई के etree में जुड़ जाते हैं, की तर्ज पर कुछ उम्मीद कर रहा था:

pi = etree.PI(...) 
doc.addprevious(pi) 

लेकिन यह मेरे लिए काम नहीं कर रहा। Lxml के साथ एक XML दस्तावेज़ में कैसे जोड़ें?

उत्तर

8

आप एक डॉक प्रकार के साथ अपने दस्तावेज़ बना सकते हैं के साथ शुरू:

# Adapted from example on http://codespeak.net/lxml/tutorial.html 
import lxml.etree as et 
import StringIO 
s = """<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE root SYSTEM "test" [ <!ENTITY tasty "cheese"> 
<!ENTITY eacute "&#233;"> ]> 
<root> 
<a>&tasty; souffl&eacute;</a> 
</root> 
""" 
tree = et.parse(StringIO.StringIO(s)) 
print et.tostring(tree, xml_declaration=True, encoding="utf-8") 

प्रिंट: क्या आप कुछ एक्सएमएल कि एक के साथ नहीं बनाया गया था करने के लिए एक डॉक प्रकार जोड़ना चाहते हैं

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE root SYSTEM "test" [ 
<!ENTITY tasty "cheese"> 
<!ENTITY eacute "&#233;"> 
]> 
<root> 
<a>cheese soufflé</a> 
</root> 

, आप पहली बार वांछित doctype के साथ एक (ऊपर) के रूप में बना सकते हैं, तो यह आपके doctype कम XML प्रतिलिपि:

xml = et.XML("<root><test/><a>whatever</a><end_test/></root>") 
root = tree.getroot() 
root[:] = xml 
root.text, root.tail = xml.text, xml.tail 
print et.tostring(tree, xml_declaration=True, encoding="utf-8") 

प्रिंट:

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE root SYSTEM "test" [ 
<!ENTITY tasty "cheese"> 
<!ENTITY eacute "&#233;"> 
]> 
<root><test/><a>whatever</a><end_test/></root> 

क्या आप यही देख रहे हैं?

+0

लिंक पुराना है। –

4

पीआई वास्तव में "डॉक्टर" से पिछले तत्व के रूप में जोड़ा जाता है। इस प्रकार, यह "डॉक्टर" का बच्चा नहीं है। आप "doc.getroottree()" का उपयोग करना चाहिए

यहाँ एक उदाहरण है:

>>> root = etree.Element("root") 
>>> a = etree.SubElement(root, "a") 
>>> b = etree.SubElement(root, "b") 
>>> root.addprevious(etree.PI('xml-stylesheet', 'type="text/xsl" href="my.xsl"')) 
>>> print etree.tostring(root, pretty_print=True, xml_declaration=True, encoding='utf-8') 
<?xml version='1.0' encoding='utf-8'?> 
<root> 
    <a/> 
    <b/> 
</root> 
getroottree साथ

():

>>> print etree.tostring(root.getroottree(), pretty_print=True, xml_declaration=True, encoding='utf-8') 
<?xml version='1.0' encoding='utf-8'?> 
<?xml-stylesheet type="text/xsl" href="my.xsl"?> 
<root> 
    <a/> 
    <b/> 
</root> 
+0

यह सही उत्तर होना चाहिए। – Tom

26

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

print etree.tostring(tree, pretty_print=True, xml_declaration=True, encoding="UTF-8", doctype="<!DOCTYPE TEST_FILE>")

+0

पहले से मौजूद पेड़ के लिए बहुत साफ समाधान। धन्यवाद। – Khorkrak

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