2009-06-19 17 views
58

पर सरल करें जेएसओएन सीरियलाइजेशन मॉड्यूल नाम "सरलजसन" नाम से है जो आसानी से जेसन को पाइथन ऑब्जेक्ट्स को क्रमबद्ध करता है।पाइथन शब्दकोश को एक्सएमएल

मैं इसी तरह के मॉड्यूल की तलाश में हूं जो एक्सएमएल को क्रमबद्ध कर सकता है।

उत्तर

13
+4

> http://code.activestate.com/recipes/415983/ यह एक्सएमएल को केवल मार्शल प्रारूप में क्रमबद्ध नहीं करता है। और मुझे अपवाद पर sys.exit पसंद नहीं है। > http://sourceforge.net/projects/pyxser/ यह बीएसडी नहीं है। क्षमा करें, मैं उल्लेख करना भूल गया, मैं पाइथन मॉड्यूल या बीएसडी की तलाश में हूं, इसलिए मैं अपने बीएसडी सॉफ्टवेयर के साथ वितरित कर सकता हूं। अंतिम 2 - webservices के लिए, मैं नियमित XML serializator की तलाश में हूं। – zinovii

+1

zdmytriv: आप बिना किसी देयता के अपने बीएसडी कोड के साथ एक एलजीपीएल लाइब्रेरी वितरित कर सकते हैं। – nosklo

+0

@ नोस्क्लो: मुझे नहीं पता था कि आप ऐसा कर सकते हैं। अब मुझे पता है, धन्यवाद। – zinovii

17

वहाँ huTools.structured.dict2xml जो आत्मा में simplejson लिए संगत होना करने की कोशिश करता है। आप यह संकेत दे सकते हैं कि नेस्टेड उप-संरचनाओं को कैसे लपेटें। huTools.structured.dict2et के लिए प्रलेखन की जांच करें जो ElementTree ऑब्जेक्ट्स देता है यदि स्ट्रिंग dict2xml द्वारा लौटाई गई है।

>>> data = {"kommiauftragsnr":2103839, "anliefertermin":"2009-11-25", "prioritaet": 7, 
... "ort": u"Hücksenwagen", 
... "positionen": [{"menge": 12, "artnr": "14640/XL", "posnr": 1},], 
... "versandeinweisungen": [{"guid": "2103839-XalE", "bezeichner": "avisierung48h", 
...       "anweisung": "48h vor Anlieferung unter 0900-LOGISTIK avisieren"}, 
... ]} 

>>> print ET.tostring(dict2et(data, 'kommiauftrag', 
... listnames={'positionen': 'position', 'versandeinweisungen': 'versandeinweisung'})) 
'''<kommiauftrag> 
<anliefertermin>2009-11-25</anliefertermin> 
<positionen> 
    <position> 
     <posnr>1</posnr> 
     <menge>12</menge> 
     <artnr>14640/XL</artnr> 
    </position> 
</positionen> 
<ort>H&#xC3;&#xBC;cksenwagen</ort> 
<versandeinweisungen> 
    <versandeinweisung> 
     <bezeichner>avisierung48h</bezeichner> 
     <anweisung>48h vor Anlieferung unter 0900-LOGISTIK avisieren</anweisung> 
     <guid>2103839-XalE</guid> 
    </versandeinweisung> 
</versandeinweisungen> 
<prioritaet>7</prioritaet> 
<kommiauftragsnr>2103839</kommiauftragsnr> 
</kommiauftrag>''' 
+0

huTools पायथन 3 ('' ''dict' ऑब्जेक्ट के साथ संगत नहीं है 'iteritems''''' 'विशेषता नहीं है)। – thomaskonrad

+0

इस चीज़ की लाइसेंसिंग शर्तें क्या हैं? क्या मैं इसे अपने वाणिज्यिक ऐप का उपयोग कर सकता हूं? –

11

इसे आजमाएं। समस्या सिर्फ मैं विशेषताओं का उपयोग नहीं है (क्योंकि मैं न उन्हें पसंद)
dict2xml on pynuggets.wordpress.com
dict2xml on activestate

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) 
       self.build(tag, l) 
       grandFather.appendChild(tag) 

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

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

if __name__ == '__main__': 
    example = {'auftrag':{"kommiauftragsnr":2103839, "anliefertermin":"2009-11-25", "prioritaet": 7,"ort": u"Huecksenwagen","positionen": [{"menge": 12, "artnr": "14640/XL", "posnr": 1},],"versandeinweisungen": [{"guid": "2103839-XalE", "bezeichner": "avisierung48h","anweisung": "48h vor Anlieferung unter 0900-LOGISTIK avisieren"},]}} 
    xml = dict2xml(example) 
    xml.display() 
+1

dict2xml 'xml.dom.HierarchyRequestErr का एक और उदाहरण बनाने के साथ यहां कुछ समस्या है: दो दस्तावेज़ तत्वों को अस्वीकार कर दिया गया है, इसलिए मैंने अनलिंक विधि जोड़ा: ' def unlink (self): self.doc.unlink() ' –

2

अजगर में अधिकांश वस्तुओं के नीचे dicts के रूप में प्रतिनिधित्व कर रहे हैं: तो यह के समान है

>>> class Fred(object) : 
... def __init__(self, n) : self.n = n 
... 
>>> a = Fred(100) 
>>> print a.__dict__ 
{'n': 100} 

पूछताछ कैसे एक्सचेंज में डिक्ट्स को परिवर्तित करने के लिए।

http://www.picklingtools.com

यहाँ एक सरल उदाहरण है:: पर एक्सएमएल से/dict परिवर्तित करने के लिए उपकरण हैं

>>> import xmltools 

    >>> d = {'a':1, 'b':2.2, 'c':'three' } 
    >>> xx = xmltools.WriteToXMLString(d) 
    >>> print xx 
    <?xml version="1.0" encoding="UTF-8"?> 
    <top> 
     <a>1</a> 
     <b>2.2</b> 
     <c>three</c> 
    </top> 

वहाँ वेब साइट पर दस्तावेज़ का एक बहुत उदाहरण दिखा रहा है:

XML Tools Manual

डिक्ट्स और एक्सएमएल के बीच "बिल्कुल" रूपांतरित करना मुश्किल है: एक क्या है सूची? गुणों के साथ आप क्या करते हैं? आप संख्यात्मक कुंजी कैसे संभालते हैं? इनमें से बहुत से मुद्दों को को संबोधित किया गया है और XML टूल दस्तावेज़ (उपरोक्त) में चर्चा की गई है।

क्या आपके लिए गति महत्वपूर्ण है? या उपयोग की आसानी आसान है? एक शुद्ध सी ++ मॉड्यूल (सभी सी ++ में लिखा गया है), एक शुद्ध पायथन मॉड्यूल (पाइथन में लिखा गया सभी), और एक पायथन सी एक्सटेंशन मॉड्यूल (सी ++ में लिखा गया है, लेकिन लपेटा गया है इसलिए पाइथन इसे कॉल कर सकता है)। सी ++ और पायथन सी एक्सटेंशन मॉड्यूल तेजी से परिमाण के आदेश हैं, लेकिन निश्चित रूप से जाने के लिए संकलन की आवश्यकता है। पायथन मॉड्यूल सिर्फ काम करना चाहिए, लेकिन धीमा है:

8

मैंने एक साधारण फ़ंक्शन लिखा जो शब्दकोशों को xml (30 पंक्तियों के नीचे) में क्रमबद्ध करता है।

उपयोग:

mydict = { 
    'name': 'The Andersson\'s', 
    'size': 4, 
    'children': { 
     'total-age': 62, 
     'child': [ 
      { 
       'name': 'Tom', 
       'sex': 'male', 
      }, 
      { 
       'name': 'Betty', 
       'sex': 'female', 
      } 
     ] 
    }, 
} 
print(dict2xml(mydict, 'family')) 

परिणाम:

<family name="The Andersson's" size="4"> 
     <children total-age="62"> 
       <child name="Tom" sex="male"/> 
       <child name="Betty" sex="female"/> 
     </children> 
</family> 

पूर्ण स्रोत (एक उदाहरण सहित) पर https://gist.github.com/reimund/5435343/

नोट पाया जा सकता है: इस समारोह को क्रमानुसार जाएगा शब्दकोश प्रविष्टियों के रूप में पाठ नोड्स के बजाय गुण। पाठ का समर्थन करने के लिए इसे संशोधित करना बहुत आसान होगा।

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