2012-03-28 11 views
5

मेरे पास xml.dom.minidom के साथ कुछ XML टेक्स्ट उत्पन्न करने के लिए कुछ पायथन कोड है। अभी, मैं इसे टर्मिनल से चलाता हूं और परिणामस्वरूप मुझे एक संरचित एक्सएमएल आउटपुट करता है। मैं इसे एक एक्सएमएल फाइल भी उत्पन्न करना चाहता हूं और इसे अपनी डिस्क पर सहेजना चाहता हूं। यह कैसे किया जा सकता है?एक एक्सएमएल फ़ाइल को पाइथन के साथ डिस्क में कैसे सहेजना है?

import xml 
from xml.dom.minidom import Document 
import copy 


class dict2xml(object): 
    doc  = Document() 

    def __init__(self, structure): 
     if len(structure) == 1: 
      rootName = str(structure.keys()[0]) 
      self.root = self.doc.createElement(rootName) 

      self.doc.appendChild(self.root) 
      self.build(self.root, structure[rootName]) 

    def build(self, father, structure): 
     if type(structure) == dict: 
      for k in structure: 
       tag = self.doc.createElement(k) 
       father.appendChild(tag) 
       self.build(tag, structure[k]) 

     elif type(structure) == list: 
      grandFather = father.parentNode 
      tagName  = father.tagName 
      # grandFather.removeChild(father) 
      for l in structure: 
       tag = self.doc.createElement(tagName.rstrip('s')) 
       self.build(tag, l) 
       father.appendChild(tag) 

     else: 
      data = str(structure) 
      tag  = self.doc.createTextNode(data) 
      father.appendChild(tag) 

    def display(self): 
     print self.doc.toprettyxml(indent=" ") 

यह सिर्फ एक्सएमएल उत्पन्न करता है:

यह है कि मैं क्या है। मैं इसे अपने डेस्कटॉप पर फ़ाइल के रूप में कैसे सहेज सकता हूं?

उत्तर

10

आप शायद अपने XML डोम पेड़ की जड़ नोड पर Node.writexml() उपयोग करना चाहते हैं। यह आपके मूल तत्व और सभी बाल तत्वों को एक XML फ़ाइल में लिख देगा, जिस तरह से सभी becessary इंडेंटिंग आदि कर रहे हैं।

See the documentation for xml.dom.minidom:

Node.writexml(writer[, indent=""[, addindent=""[, newl=""]]])

लेखक वस्तु के लिए एक्सएमएल लिखें। लेखक के पास write() विधि होनी चाहिए जो फ़ाइल ऑब्जेक्ट इंटरफ़ेस से मेल खाती हो। indent पैरामीटर वर्तमान नोड का इंडेंटेशन है। addindent पैरामीटर वर्तमान के उपनगरों के लिए उपयोग करने के लिए वृद्धिशील इंडेंटेशन है। newl पैरामीटर को न्यूलाइन समाप्त करने के लिए उपयोग करने के लिए स्ट्रिंग निर्दिष्ट करता है।

दस्तावेज़ नोड के लिए, अतिरिक्त कीवर्ड तर्क एन्कोडिंग हो सकता है जो XML शीर्षलेख के एन्कोडिंग फ़ील्ड को निर्दिष्ट करने के लिए उपयोग किया जाता है।

संस्करण 2.1 में बदला गया: वैकल्पिक कीवर्ड पैरामीटर इंडेंट, addindent, और newl को सुंदर आउटपुट का समर्थन करने के लिए जोड़ा गया था।

संस्करण 2.3 में बदला गया: दस्तावेज़ नोड के लिए, एक अतिरिक्त कीवर्ड तर्क एन्कोडिंग का उपयोग XML शीर्षलेख के एन्कोडिंग फ़ील्ड को निर्दिष्ट करने के लिए किया जा सकता है।

प्रयोग कुछ हद तक तरह होगा:

file_handle = open("filename.xml","wb") 
Your_Root_Node.writexml(file_handle) 
file_handle.close() 
+0

अभी भी इसे काम करने के लिए प्रबंधित नहीं कर सकता –

+1

आपने वास्तव में क्या किया कोशिश करें? आपके संपादित प्रश्न में केवल एक्सएमएल को कंसोल पर प्रिंट करने के लिए कोड शामिल है। इसमें 'writexml()' का उपयोग करने का आपका प्रयास शामिल नहीं है, इसलिए हम इसे ठीक करने में आपकी सहायता नहीं कर सकते हैं। कृपया हमें दिखाएं कि आपने इसका उपयोग करने का प्रयास कैसे किया 'writexml() 'और यह कैसे काम करने में असफल रहा (क्या कोई त्रुटि संदेश था? या क्या यह आपके काम के रूप में काम करने में असफल रहा?) –

+0

मोड में खोलना" wb "मेरे लिए काम नहीं करता है, हालांकि सिर्फ" डब्ल्यू "काम करता है –

6

, अजगर files के बारे में पढ़ें यदि आप xml स्ट्रिंग के रूप में आप इसे किसी फ़ाइल में जैसे लिख सकते हैं

xml = "<myxmldata/>" 
f = open("myxmlfile.xml", "wb") 
f.write(xml) 
f.close() 

minidom नोड से xml स्ट्रिंग प्राप्त करने के लिए आप

xml = Node.toxml() 

उपयोग कर सकते हैं या आप सीधे एक वस्तु जो जैसे लिखने का समर्थन करता है पर लिख सकते हैं एक फ़ाइल

Node.writexml(f) 
+0

आप एक उद्धरण चिह्न याद किया। ;) –

+0

@ लुकास परेरा - "फाइलें" केवल 1/2 कहानी हैं। आपको 1) एक SimplXML ऑब्जेक्ट बनाने और पॉप्युलेट करने की आवश्यकता है, फिर 2) ऑब्जेक्ट को टेक्स्ट फ़ाइल में लिखें। ली-आंग यिप चर्चा करता है कि कैसे। – paulsm4

+0

@ paulsm4 उन्होंने कहा कि वह पहले ही टर्मिनल –

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