2015-03-02 7 views
14

पृष्ठभूमि

मैं डेटाबेस तक पहुंचने के लिए SQLite का उपयोग कर रहा हूं और वांछित जानकारी पुनर्प्राप्त कर रहा हूं। मैं उस जानकारी के साथ एक एक्सएमएल फ़ाइल बनाने के लिए पायथन संस्करण 2.6 में ElementTree का उपयोग कर रहा हूं।मैं एक एक्सएमएल फ़ाइल पर सुंदर प्रिंट करने के लिए पाइथन की एलिमेंट ट्री कैसे प्राप्त करूं?

कोड

import sqlite3 
import xml.etree.ElementTree as ET 

# NOTE: Omitted code where I acccess the database, 
# pull data, and add elements to the tree 

tree = ET.ElementTree(root) 

# Pretty printing to Python shell for testing purposes 
from xml.dom import minidom 
print minidom.parseString(ET.tostring(root)).toprettyxml(indent = " ") 

####### Here lies my problem ####### 
tree.write("New_Database.xml") 

प्रयास

मैं ऊपर कोड की अंतिम पंक्ति के स्थान पर tree.write("New_Database.xml", "utf-8") उपयोग करने की कोशिश की है, लेकिन यह बिल्कुल भी एक्सएमएल के लेआउट को संपादित नहीं किया - यह अभी भी एक गड़बड़ गड़बड़ है। बजाय अजगर खोल, जो त्रुटि AttributeError देता को यह मुद्रण के
tree = minidom.parseString(ET.tostring(root)).toprettyxml(indent = " ")
:

मैं भी बेला के आसपास का फैसला किया और कर की कोशिश की 'यूनिकोड' ऑब्जेक्ट कोई विशेषता 'लिखने' है।

प्रश्न

जब मैं अंतिम पंक्ति पर एक XML फ़ाइल करने के लिए अपने पेड़ लिखते हैं, वहाँ एक रास्ता बहुत एक्सएमएल फ़ाइल को मुद्रित करने के लिए के रूप में यह अजगर खोल के लिए करता है?

क्या मैं यहां toprettyxml() का उपयोग कर सकता हूं या ऐसा करने का कोई अलग तरीका है?

उत्तर

19

जो भी आपकी एक्सएमएल स्ट्रिंग है, आप फ़ाइल को स्ट्रिंग लिखने और लिखने के लिए फ़ाइल खोलकर अपनी पसंद की फाइल पर लिख सकते हैं।

from xml.dom import minidom 

xmlstr = minidom.parseString(ET.tostring(root)).toprettyxml(indent=" ") 
with open("New_Database.xml", "w") as f: 
    f.write(xmlstr) 

एक संभावित जटिलता, विशेष रूप से अजगर 2, जो दोनों कम सख्त और तार में यूनिकोड वर्ण के बारे में कम परिष्कृत है में नहीं है। यदि आपकी toprettyxml विधि यूनिकोड स्ट्रिंग (u"something") को वापस हाथ देती है, तो आप इसे उपयुक्त फ़ाइल एन्कोडिंग जैसे यूटीएफ -8 पर डालना चाहेंगे। जैसे के साथ एक लिखने लाइन की जगह:

f.write(xmlstr.encode('utf-8')) 
+0

यह उत्तर स्पष्ट होगा यदि आपने 'import xml.dom.minidom को minidom' कथन के रूप में शामिल किया है, जो आवश्यक प्रतीत होता है। –

+0

@ केनप्रोनोविसी संभवतः। वह आयात मूल प्रश्न में प्रकट होता है, लेकिन मैंने इसे यहां जोड़ा है इसलिए कोई भ्रम नहीं है। –

+0

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

3

स्थापित सुंदर प्रिंट bs4

pip install bs4 

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

from bs4 import BeautifulSoup 

x = your xml 

print(BeautifulSoup(x, "xml").prettify()) 
+0

यह एक अच्छा समाधान है जब हम XML को फ़ाइल में नहीं लिखना चाहते हैं। – FearlessFuture

1

vkbeautify मॉड्यूल पर एक नजर डालें।

इनपुट और आउटपुट किसी भी संयोजन में स्ट्रिंग/फ़ाइल हो सकता है। यह बहुत कॉम्पैक्ट है और इसकी कोई निर्भरता नहीं है।

import vkbeautify as vkb 

a) pretty_text = vkb.xml(your_xml_text) #return String 

b) vkb.xml(your_xml_text, 'path/to/dest/file') #save in file 
+0

मैंने इसे इंस्टॉल किया है और जब भी मैं चलाने की कोशिश करता हूं, तो मुझे 'ValueError: stat: पथ विंडोज़ के लिए बहुत लंबा लगता है, मुझे लगता है क्योंकि मेरा एक्सएमएल 255 अक्षरों के विंडोज प्रतिबंध से लंबा है और यह देखने का प्रयास कर रहा है कि मेरा एक्सएमएल इनपुट है या नहीं इसे संसाधित करने से पहले पथ। –

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