2013-01-23 9 views
13

का उपयोग करते समय मैं अपने xml फ़ाइल सुंदर बनाना के लिए एक minidom.toprettyxml उपयोग कर रहे हैं। जब मैं एक्सएमएल फ़ाइल बना रहा हूं और इस पद्धति का उपयोग, सभी जाली काम करता है, लेकिन अगर मैं इसका इस्तेमाल के बाद मैं xml फ़ाइल संशोधित किया (examp के लिए मैं एक अतिरिक्त नोड्स जोड़ दिया है) और फिर मैं यह लिख रहा हूँ करने के लिए वापस एक्सएमएल, मैं खाली लाइनों, हर बार जब मैं इसे अद्यतन करने कर रहा हूँ हो रही है, मैं अधिक से अधिक खाली लाइनों हो रही है ...खाली लाइनों minidom.toprettyxml

मेरी कोड:

file.write(prettify(xmlRoot)) 


def prettify(elem): 
    rough_string = xml.tostring(elem, 'utf-8') //xml as ElementTree 
    reparsed = mini.parseString(rough_string) //mini as minidom 
    return reparsed.toprettyxml(indent=" ") 

और परिणाम:

<?xml version="1.0" ?> 
<testsuite errors="0" failures="3" name="TestSet_2013-01-23 14_28_00.510935" skip="0"  tests="3" time="142.695" timestamp="2013-01-23 14:28:00.515460"> 




    <testcase classname="TC test" name="t1" status="Failed" time="27.013"/> 




    <testcase classname="TC test" name="t2" status="Failed" time="78.325"/> 


    <testcase classname="TC test" name="t3" status="Failed" time="37.357"/> 
</testsuite> 

किसी भी सुझाव?

धन्यवाद।

उत्तर

15

मैं यहाँ एक समाधान पाया: http://code.activestate.com/recipes/576750-pretty-print-xml/

तो मैं इसे संशोधित एक फ़ाइल के बजाय एक स्ट्रिंग लेने के लिए।

from xml.dom.minidom import parseString 

pretty_print = lambda data: '\n'.join([line for line in parseString(data).toprettyxml(indent=' '*2).split('\n') if line.strip()]) 

आउटपुट:

<?xml version="1.0" ?> 
<testsuite errors="0" failures="3" name="TestSet_2013-01-23 14_28_00.510935" skip="0" tests="3" time="142.695" timestamp="2013-01-23 14:28:00.515460"> 
    <testcase classname="TC test" name="t1" status="Failed" time="27.013"/> 
    <testcase classname="TC test" name="t2" status="Failed" time="78.325"/> 
    <testcase classname="TC test" name="t3" status="Failed" time="37.357"/> 
</testsuite> 

यह आपको अपनी समारोह में यह काम थोड़ा आसान हो मदद मिल सकती है:

def new_prettify(): 
    reparsed = parseString(CONTENT) 
    print '\n'.join([line for line in reparsed.toprettyxml(indent=' '*2).split('\n') if line.strip()]) 
+0

जो - दुर्भाग्य से मैं पार्सर से एक अपवाद हो रही है "स्ट्रिंग है या केवल पढ़ने के लिए बफ़र, तत्व नहीं होना चाहिए" – Igal

+0

जो - बस यह स्पष्ट करने के लिए? क्या मुझे इस कोड का उपयोग करने की आवश्यकता है जबकि मैं एक्सएमएल बना रहा हूं या इसे बनाए जाने के बाद और यह खाली लाइनों को हटा रहा है? धन्यवाद। – Igal

+0

हल, महान !! धन्यवाद ! – Igal

0

उपयोग इस लाइनों के साथ समस्या को हल करने

toprettyxml(indent=' ', newl='\r', encoding="utf-8")

+1

यद्यपि यह समस्या की मदद कर सकता है, लेकिन मैं आपको अधिक विस्तार से वर्णन करने की सलाह दूंगा कि आपका उत्तर कैसे मदद करता है। – Wtower

3

मैं, इस समस्या के लिए एक आसान समाधान पाया अभी पिछले लाइन की आप सुंदर बनाना (बदलाव के साथ) तो यह हो जाएगा:

def prettify(elem): 
rough_string = xml.tostring(elem, 'utf-8') //xml as ElementTree 
reparsed = mini.parseString(rough_string) //mini as minidom 
return reparsed.toprettyxml(indent=" ", newl='') 
0

मैं (32b) एक Windows में अजगर 2.7 के साथ एक ही मुद्दा हो रहा है 10 मशीन मुद्दा यह प्रतीत होता है कि जब पायथन एक एलीमेंट ट्री ऑब्जेक्ट में एक एक्सएमएल टेक्स्ट पार्स करता है, तो यह कुछ कष्टप्रद लाइन फ़ीड्स को प्रत्येक तत्व के "टेक्स्ट" या "पूंछ" विशेषताओं में जोड़ता है।

यह स्क्रिप्ट ऐसी लाइन ब्रेक वर्णों निकालता है: इससे पहले कि "बहुत-मुद्रण" अपने पेड़

def removeAnnoyingLines(elem): 
    hasWords = re.compile("\\w") 
    for element in elem.iter(): 
     if not re.search(hasWords,str(element.tail)): 
      element.tail="" 
     if not re.search(hasWords,str(element.text)): 
      element.text = "" 

इस समारोह का उपयोग करें:

removeAnnoyingLines(element) 
myXml = xml.dom.minidom.parseString(xml.etree.ElementTree.tostring(element)) 
print myXml.toprettyxml() 

यह मेरे लिए काम किया। आशा है कि ये आपके काम आएगा!

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