2009-01-23 24 views
53

Possible Duplicate:
Converting XML to JSON using Python?पायथन में XML से JSON को कैसे परिवर्तित करें?

मैं अनुप्रयोग इंजन पर कुछ काम कर रहा हूँ और मैं एक XML दस्तावेज एक बराबर JSON ऑब्जेक्ट में एक दूरस्थ सर्वर से प्राप्त की जा रही बदलना होगा।

मैं का उपयोग कर रहा हूं ताकि XML डेटा को urlfetch द्वारा वापस किया जा सके। मैं पार्स किए गए XML दस्तावेज़ को JSON में रूपांतरित करने के लिए django.utils.simplejson का उपयोग करने का भी प्रयास कर रहा हूं। मैं पूरी तरह से एक नुकसान पर हूं कि कैसे दोनों को एक साथ हुक करना है।

from xml.dom import minidom 
from django.utils import simplejson as json 

#pseudo code that returns actual xml data as a string from remote server. 
result = urlfetch.fetch(url,'','get'); 

dom = minidom.parseString(result.content) 
json = simplejson.load(dom) 

self.response.out.write(json) 
+0

पहले: http://stackoverflow.com/questions/191536/converting-xml-to-json-using-python – RexE

+0

इस पर एक नज़र डालें: https://github.com/aausch/filteringxmljsonifier – blueberryfields

उत्तर

22

एलएक्सएमएल ऑब्जेक्टिफाइ के लिए सोवियत की सलाह अच्छी है। एक विशेष रूप से subclassed simplejson के साथ, आप एक एलएक्सएमएल परिणाम जेसन में परिणाम बदल सकते हैं।

import simplejson as json 
import lxml 

class objectJSONEncoder(json.JSONEncoder): 
    """A specialized JSON encoder that can handle simple lxml objectify types 
     >>> from lxml import objectify 
     >>> obj = objectify.fromstring("<Book><price>1.50</price><author>W. Shakespeare</author></Book>")  
     >>> objectJSONEncoder().encode(obj) 
     '{"price": 1.5, "author": "W. Shakespeare"}'  
""" 


    def default(self,o): 
     if isinstance(o, lxml.objectify.IntElement): 
      return int(o) 
     if isinstance(o, lxml.objectify.NumberElement) or isinstance(o, lxml.objectify.FloatElement): 
      return float(o) 
     if isinstance(o, lxml.objectify.ObjectifiedDataElement): 
      return str(o) 
     if hasattr(o, '__dict__'): 
      #For objects with a __dict__, return the encoding of the __dict__ 
      return o.__dict__ 
     return json.JSONEncoder.default(self, o) 

उपयोग के उदाहरण के लिए docstring देखें, अनिवार्य रूप से आप की objectJSONEncoder

नोट एक उदाहरण है कि कोएन के बिंदु, यहाँ बहुत मान्य है केवल काम करता है इसके बाद के संस्करण समाधान के एनकोड विधि के लिए lxml objectify का परिणाम पारित केवल घोंसला वाले एक्सएमएल के लिए और इसमें रूट तत्वों का नाम शामिल नहीं है। यह तय किया जा सकता है।pesterfesh के आधार पर http://gist.github.com/345559

+1

क्या मैं टैग जो एक ही टैग नाम के साथ कई बच्चे हैं है या नहीं? – vittore

+0

@ विटोर: आप 'रिटर्न ओ .__ dict__' को' रिटर्न [i .__ dict__ के लिए i में]] के साथ कई बच्चों को संभालने के लिए प्रतिस्थापित कर सकते हैं। – weaver

+0

@weaver जो लगभग वही है जो मैंने किया था। – vittore

7

याकूब Smullyan एक उपयोगिता जो effbot के ElementTree का उपयोग करता है JSON करने के लिए XML परिवर्तित करने के लिए कहा जाता है pesterfish लिखा है: नीचे दिए गए कोड को संवारता मैं कर रहा हूँ है।

+0

पीआईपी के साथ स्थापित करना टूटा हुआ प्रतीत होता है: 'यूनिकोडडेकोड त्रुटि:' utf8 'कोडेक स्थिति 1 में बाइट 0x8b को डीकोड नहीं कर सकता: अमान्य प्रारंभ बाइट ' – smci

11

मुझे लगता है कि एक्सएमएल प्रारूप इतना विविध हो सकता है कि एक कोड लिखना असंभव है जो बिना किसी सख्त परिभाषित XML प्रारूप के ऐसा कर सकता है। यहाँ है कि मैं क्या मतलब है:

<persons> 
    <person> 
     <name>Koen Bok</name> 
     <age>26</age> 
    </person> 
    <person> 
     <name>Plutor Heidepeen</name> 
     <age>33</age> 
    </person> 
</persons> 

{'persons': [ 
    {'name': 'Koen Bok', 'age': 26}, 
    {'name': 'Plutor Heidepeen', 'age': 33}] 
} 

बन सकते हैं लेकिन क्या यह होगा:

<persons> 
    <person name="Koen Bok"> 
     <locations name="defaults"> 
      <location long=123 lat=384 /> 
     </locations> 
    </person> 
</persons> 

देखें कि मैं क्या मतलब है?

संपादित करें: http://www.xml.com/pub/a/2006/05/31/converting-between-xml-and-json.html

+1

आलेख आपको जावास्क्रिप्ट –

+6

@ जॉर्ज के लिए मिला है आलेख XML और JSON को roundtripping के सामान्य मुद्दों के बारे में है। यह इस विषय के लिए बहुत जर्मन है। अंत में जावास्क्रिप्ट कोड को फेंकने दो मत। – zigg

+1

@Koen, इस तरह दिखेगा। { "व्यक्तियों": { "व्यक्ति": { "-name": "कोएन बॉक", "स्थान": { "-name": "चूक", ​​ "स्थान": { "लंबी ":" 123 ", " -lat ":" 384 " } } } } } –

4

एक संभावना यह lxml module से objectify या ElementTree उपयोग करने के लिए होगा: सिर्फ इस लेख पाया। एक पुराने संस्करण ElementTree भी python xml.etree मॉड्यूल में भी उपलब्ध है। इनमें से कोई भी आपके एक्सएमएल को पायथन ऑब्जेक्ट में परिवर्तित कर देगा, जिसे आप JSON पर ऑब्जेक्ट को क्रमबद्ध करने के लिए simplejson का उपयोग कर सकते हैं।

हालांकि यह एक दर्दनाक मध्यवर्ती चरण की तरह प्रतीत हो सकता है, जब आप एक्सएमएल और सामान्य पायथन ऑब्जेक्ट्स दोनों से निपट रहे हैं तो यह अधिक समझ में आता है।

1

सामान्य रूप से, आप एक्सएमएल से अपनी भाषा की नियमित वस्तुओं तक जाना चाहते हैं (क्योंकि आमतौर पर ऐसा करने के लिए उचित उपकरण होते हैं, और यह कठिन रूपांतरण है)। और फिर सादा ओल्ड ऑब्जेक्ट जेएसओएन का उत्पादन करता है - इसके लिए भी उपकरण हैं, और यह एक बहुत ही सरल धारावाहिक है (चूंकि जेएसओएन "ऑब्जेक्ट नोटेशन" है, ऑब्जेक्ट्स को क्रमबद्ध करने के लिए प्राकृतिक फिट)। मुझे लगता है कि पाइथन के पास टूल का सेट है।

1

मैं एक छोटे से कमांड लाइन आधारित अजगर पटकथा लिखी है कि वास्तव में यह करता है:

https://github.com/hay/xml2json

+0

यह लिंक टूटा हुआ है। यह अच्छा होगा अगर यह अपडेट किया गया था (यदि स्क्रिप्ट अभी भी मौजूद है)। –

+0

वूप्स, मैंने स्क्रिप्ट को अपने स्वयं के भंडार में स्थानांतरित कर दिया। 404 ध्यान देने के लिए धन्यवाद! – Husky

+0

धन्यवाद, यह सही है। ध्यान देने योग्य बात यह है कि इसे स्थापित करने के लिए सरलजॉन की आवश्यकता है: sudo easy_install simplejson – Suman

65

xmltodict (पूर्ण

मैं एक सार यहाँ में इस वर्ग को शामिल किया है प्रकटीकरण: मैंने इसे लिखा है) इस "standard" के बाद, आप अपने एक्सएमएल को एक dict + list + स्ट्रिंग संरचना में बदलने में मदद कर सकते हैं। यह Expat-आधारित है, इसलिए यह बहुत तेज है और पूरे XML पेड़ को स्मृति में लोड करने की आवश्यकता नहीं है।

एक बार जब आप उस डेटा संरचना है, तो आप यह JSON को क्रमानुसार कर सकते हैं:

import xmltodict, json 

o = xmltodict.parse('<e> <a>text</a> <a>text</a> </e>') 
json.dumps(o) # '{"e": {"a": ["text", "text"]}}' 
+2

क्या आपने उलटा लिखा है? मुझे लगता है कि इस तरह के एक जानवर में दिलचस्पी होगी। – zigg

+0

मेरे पास नहीं है, लेकिन ऐसा करना मुश्किल नहीं है। मुझे नहीं पता था कि "अर्द्ध संरचित" एक्सएमएल के साथ क्या करना है, हालांकि। ' टेक्स्ट सी अधिक टेक्स्ट' -> '{'a': {'#text': 'टेक्स्ट moretext', 'b': 'c'}} -> अब क्या है? –

+1

आप Goessner के लेख से सख्ती से जाना है, तो आप वास्तव में पड़ा है चाहिए '{ 'एक': 'पाठ moretext'}' है, जो तब ' पाठ < ख > ग </b > moretext' को roundtrips .. JSON और XML के बीच विसंगति इस तरह की अजीब स्थिति बनाती है। मैंने एलीमेंट ट्री का उपयोग करके पूरी चीज पर एक स्टैब लिया, हालांकि, एपीआई काम के लिए मैं कर रहा हूं। https://github.com/zigg/xon – zigg

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