পাইথন ব্যবহার করে XML কে JSON এ রূপান্তর করছেন?


170

আমি ওয়েবে অনভিজ্ঞ XML-> JSON কোডের ন্যায্য অংশ দেখেছি এবং স্ট্যাকের ব্যবহারকারীদের সাথে কিছুটা কথা বলার পরে আমি নিশ্চিত যে এই জনতা গুগলের ফলাফলের প্রথম কয়েকটি পৃষ্ঠার চেয়ে আরও বেশি সহায়তা করতে পারে।

সুতরাং, আমরা একটি আবহাওয়া ফিড পার্স করছি, এবং আমাদের প্রচুর ওয়েব সাইটে ওয়েদার উইজেটগুলি পপুলি করা দরকার। আমরা এখন পাইথন-ভিত্তিক সমাধানগুলি সন্ধান করছি।

এই প্রকাশ্য weather.com RSS ফীড আমরা কি চাই পার্স করা একটি ভাল উদাহরণ আছে ( আমাদের প্রকৃত weather.com ফীডে একটি অংশীদারিত্ব W / তাদের কারণ অতিরিক্ত তথ্য উপস্থিত রয়েছে )।

সংক্ষেপে, পাইথন ব্যবহার করে আমাদের কীভাবে এক্সএমএলকে জেএসএনে রূপান্তর করা উচিত?

উত্তর:


61

তাই অন্য এক রূপান্তর অগত্যা কি করতে চান তার কিছু বোধ থাকা প্রয়োজন আছে, কোন "ওয়ান টু-একটি" এক্সএমএল এবং JSON মধ্যে ম্যাপিং হয় না ফলাফল সঙ্গে।

বলা হচ্ছে, পাইথনের স্ট্যান্ডার্ড লাইব্রেরিতে এক্সএমএল (ডিওএম, স্যাক্স এবং এলিমেন্ট্রি সহ) পার্স করার জন্য বেশ কয়েকটি মডিউল রয়েছে। পাইথন ২.6 হিসাবে, জেএসওএন থেকে পাইথন ডেটা স্ট্রাকচারকে রূপান্তর করার জন্য সমর্থনটি jsonমডিউলটিতে অন্তর্ভুক্ত রয়েছে ।

সুতরাং অবকাঠামো আছে।


2
এক্সএমএলজসন আইএমএইচও বাক্সের বাইরে বিভিন্ন কনভেনশনগুলির সমর্থন সহ দ্রুত ব্যবহার করা। pypi.org/project/xMLjson
nitinr708

এটি ইতিমধ্যে নতুন উত্তরে উল্লেখ করা হয়েছে। এটি এখনও কেবলমাত্র বৈধ এক্সএমএল কনস্ট্রাক্টসের একটি ছোট উপসেটকে কভার করে, তবে সম্ভবত মানুষ বেশিরভাগ অনুশীলনে ব্যবহার করে।
ড্যান লেন্সকি

281

xmltodict (সম্পূর্ণ প্রকাশ: আমি এটি লিখেছি) আপনাকে এই "স্ট্যান্ডার্ড" অনুসরণ করে আপনার এক্সএমএলকে ডিক + তালিকা + স্ট্রিং স্ট্রাকচারে রূপান্তর করতে সহায়তা করতে পারে । এটি এক্সপ্যাট ভিত্তিক, সুতরাং এটি খুব দ্রুত এবং সম্পূর্ণ এক্সএমএল গাছটিকে স্মৃতিতে লোড করার দরকার নেই।

আপনার সেই ডেটা কাঠামোটি একবার হয়ে গেলে, আপনি এটি JSON এ সিরিয়ালাইজ করতে পারেন:

import xmltodict, json

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

@ মার্টিন ব্লিচ যদি আমি আমার জ্যাঙ্গো মডেল ফাইল থেকে একটি জেসন ফাইল তৈরি করি। প্রয়োজনীয় ক্ষেত্রগুলির জন্য এক্সএমএলকে জসসনে রূপান্তর করতে আমি কীভাবে আমার এক্সএমএল ফাইলটি মানচিত্র করতে পারি?
sayth

1
@ সায়েথ আমি মনে করি আপনার এটি পৃথক এসও প্রশ্ন হিসাবে পোস্ট করা উচিত।
মার্টিন ব্লেক

@ মার্টিন ব্লেক আমি একটি প্রশ্ন জুড়েছেন, কিন্তু এটা এত মাপসই, আমি একটি শিক্ষানবিস তাই হিসাবে আমি করতে অনেক তথ্য হিসাবে প্রদান করা হয়েছে am বরং কঠিন, কিন্তু আমি আপনি আরো স্বচ্ছতা প্রয়োজন হতে পারে আশা stackoverflow.com/q/23676973/461887
sayth

এত দিন পরে, আমি কিছুটা অবাক হয়েছি xmltodict কিছু লিনাক্স বিতরণের কোনও "স্ট্যান্ডার্ড" লাইব্রেরি নয়। Altough এটা সোজা থেকে কাজ করছেন কি আমরা পড়তে পারেন বলে মনে হয়, আমি দুর্ভাগ্যবশত XSLT রূপান্তর মত অন্য সমাধান ব্যবহার করবে
sancelot

এই দুর্দান্ত লাইব্রেরি লেখার জন্য একটি টন ধন্যবাদ। যদিও bs4এক্সএমএল এর কাজটি
ডিক্ট

24

আপনি বিভিন্ন এক্সএমএল জেএসএন কনভেনশন ব্যবহার করে রূপান্তর করতে এক্সএমএলজসন গ্রন্থাগারটি ব্যবহার করতে পারেন ।

উদাহরণস্বরূপ, এই এক্সএমএল:

<p id="1">text</p>

ব্যাজার ফিশ কনভেনশনটির মাধ্যমে এটি অনুবাদ করে :

{
  'p': {
    '@id': 1,
    '$': 'text'
  }
}

এবং জিডিটা কনভেনশনের মাধ্যমে এটিতে (বৈশিষ্ট্যগুলি সমর্থিত নয়):

{
  'p': {
    '$t': 'text'
  }
}

... এবং পার্কার সম্মেলনের মাধ্যমে এটিতে (বৈশিষ্ট্যগুলি সমর্থিত নয়):

{
  'p': 'text'
}

XML থেকে JSON এবং JSON থেকে XML এ একই কনভেনশন ব্যবহার করে রূপান্তর করা সম্ভব:

>>> import json, xmljson
>>> from lxml.etree import fromstring, tostring
>>> xml = fromstring('<p id="1">text</p>')
>>> json.dumps(xmljson.badgerfish.data(xml))
'{"p": {"@id": 1, "$": "text"}}'
>>> xmljson.parker.etree({'ul': {'li': [1, 2]}})
# Creates [<ul><li>1</li><li>2</li></ul>]

প্রকাশ: আমি এই গ্রন্থাগারটি লিখেছি। আশা করি এটি ভবিষ্যত অনুসন্ধানকারীদের সহায়তা করবে।


4
এটি একটি দুর্দান্ত শীতল গ্রন্থাগার, তবে অনুগ্রহ করে ব্যক্তিগত ওপেন-সোর্স লাইব্রেরি কীভাবে অফার করবেন তা পড়ুন ? আপনি আরও উত্তর পোস্ট করার আগে এটি বন্ধ দেখাচ্ছে।
মার্টিজান পিটারস

1
ধন্যবাদ @ মার্তিজজনপিটারস - আমি সবেমাত্র এটি পেরিয়েছি এবং নিশ্চিত করব যে আমি এটিকে আঁকড়েই রয়েছি।
এস আনন্দ

1
সমাধানের জন্য আনন্দকে ধন্যবাদ - এটি ভাল কাজ করে বলে মনে হচ্ছে, বাহ্যিক নির্ভরতা নেই এবং বিভিন্ন কনভেনশন ব্যবহার করে কীভাবে বৈশিষ্ট্যগুলি পরিচালনা করা হয় তাতে অনেক নমনীয়তা সরবরাহ করে। ঠিক আমার যা প্রয়োজন ছিল তা হ'ল এবং আমি খুঁজে পেয়েছি সবচেয়ে নমনীয় এবং সহজ সমাধান।
এমবিবেমে

ধন্যবাদ আনন্দ - দুর্ভাগ্যক্রমে, আমি এটি ইউটিএফ 8 এনকোডিং সহ এক্সএমএল বিশ্লেষণ করতে পারছি না। সূত্র ধরে, মনে হচ্ছে এক্সএমএল পার্সার (..) এর মাধ্যমে এনকোডিং সেটটি উপেক্ষা করা হয়েছে
প্যাট্রিক বেক

@ পেট্রিকবেেক আপনি কি এক্সএমএলের একটি ছোট্ট উদাহরণটি ইউটিএফ ৮ এনকোডিংয়ের সাথে ভাগ করে নিতে পারেন?
এস আনন্দ

11

কিছু সময় আপনি যদি সমস্ত ডেটার পরিবর্তে শুধুমাত্র প্রতিক্রিয়া কোড পান তবে জসন পার্সের মতো ত্রুটি থাকবে তাই আপনাকে এটি পাঠ্য হিসাবে রূপান্তর করতে হবে

import xmltodict

data = requests.get(url)
xpars = xmltodict.parse(data.text)
json = json.dumps(xpars)
print json 

7

আমি তার জন্য নির্মিত কোডটি এখানে। সামগ্রীর কোনও পার্সিং নেই, কেবল সরল রূপান্তর।

from xml.dom import minidom
import simplejson as json
def parse_element(element):
    dict_data = dict()
    if element.nodeType == element.TEXT_NODE:
        dict_data['data'] = element.data
    if element.nodeType not in [element.TEXT_NODE, element.DOCUMENT_NODE, 
                                element.DOCUMENT_TYPE_NODE]:
        for item in element.attributes.items():
            dict_data[item[0]] = item[1]
    if element.nodeType not in [element.TEXT_NODE, element.DOCUMENT_TYPE_NODE]:
        for child in element.childNodes:
            child_name, child_dict = parse_element(child)
            if child_name in dict_data:
                try:
                    dict_data[child_name].append(child_dict)
                except AttributeError:
                    dict_data[child_name] = [dict_data[child_name], child_dict]
            else:
                dict_data[child_name] = child_dict 
    return element.nodeName, dict_data

if __name__ == '__main__':
    dom = minidom.parse('data.xml')
    f = open('data.json', 'w')
    f.write(json.dumps(parse_element(dom), sort_keys=True, indent=4))
    f.close()

7

জেএসএন হিসাবে এক্সএমএল-ভিত্তিক মার্কআপ পরিবহনের একটি পদ্ধতি রয়েছে যা এটিকে ক্ষতিহীনভাবে তার মূল ফর্মটিতে রূপান্তরিত করতে দেয়। Http://jsonML.org/ দেখুন ।

এটি জেএসএনের এক ধরণের এক্সএসএলটি। আমি আশা করি আপনি এটি সহায়ক হবে


7

যে কারও কাছে এখনও এটির প্রয়োজন হতে পারে। এই রূপান্তরটি করার জন্য এখানে একটি নতুন, সাধারণ কোড।

from xml.etree import ElementTree as ET

xml    = ET.parse('FILE_NAME.xml')
parsed = parseXmlToJson(xml)


def parseXmlToJson(xml):
  response = {}

  for child in list(xml):
    if len(list(child)) > 0:
      response[child.tag] = parseXmlToJson(child)
    else:
      response[child.tag] = child.text or ''

    # one-liner equivalent
    # response[child.tag] = parseXmlToJson(child) if len(list(child)) > 0 else child.text or ''

  return response

1
এটি পাইথন 3..7 এ কমপক্ষে কাজ করে, যদিও দুর্ভাগ্যক্রমে এটি কিছু মূল মানগুলিতে কিছু অপ্রত্যাশিত ডেটা যুক্ত করে যদি নির্দিষ্ট মানগুলি আপনার এক্সএমএল এ থাকে, উদাহরণস্বরূপ মূলের স্তরের নোডের একটি এক্সএমএলএনএস ট্যাগ প্রতিটি নোড কীতে প্রদর্শিত হয়: {'{ maven .apache.org / POM / 4.0.0 } artifactId ':' টেস্ট-পরিষেবা ', যা এক্সএমএল থেকে এসেছে: <প্রকল্প xMLns = " maven.apache.org/POM/4.0.0 " এক্সসি: স্কিমা লোকেশন = " ম্যাভেন .apache.org / POM / 4.0.0 maven.apache.org/xsd/maven-4.0.0.xsd "xmlns: xsi =" w3.org/2001/XMLSchema-instance "> <মডেল ভার্শন> 4.0.0 </ মডেল ভার্সন>
hrbdg

5

আপনি http://designtheory.org/library/extrep/designdb-1.0.pdf এ একবার দেখতে চান । এই প্রকল্পটি XML ফাইলের একটি বড় লাইব্রেরির JSON রূপান্তর করে একটি এক্সএমএল দিয়ে শুরু হবে। রূপান্তরটিতে অনেক গবেষণা হয়েছিল এবং সর্বাধিক সাধারণ স্বজ্ঞাত এক্সএমএল -> জেএসওএন ম্যাপিং প্রস্তুত করা হয়েছিল (এটি নথির প্রথম দিকে বর্ণিত হয়েছে)। সংক্ষেপে, সমস্ত কিছু JSON অবজেক্টে রূপান্তর করুন এবং পুনরাবৃত্তিকারী ব্লকগুলিকে অবজেক্টের তালিকা হিসাবে রাখুন।

কী / মান জোড়ার অর্থ (পাইথনে অভিধান, জাভাতে হ্যাশম্যাপ, জাভাস্ক্রিপ্টে বস্তু)

কোনও অভিন্ন ডকুমেন্ট পেতে এক্সএমএলে ফিরে কোনও ম্যাপিং নেই, কারণটি হ'ল কোনও কী / মান জুটি কোনও অ্যাট্রিবিউট বা একটি ছিল কিনা তা অজানা <key>value</key>, সুতরাং তথ্যটি হারিয়ে গেছে।

আপনি যদি আমাকে জিজ্ঞাসা করেন, গুণাবলী শুরু করার জন্য একটি হ্যাক; তারপরে তারা এইচটিএমএল-এর পক্ষে ভাল কাজ করেছে।


4

ঠিক আছে, সম্ভবত সহজ উপায়টি হ'ল এক্সএমএলকে অভিধানগুলিতে পার্স করা এবং তারপরে সিম্পলজসনের সাহায্যে এটি সিরিয়াল করা।


4

আমি সরাসরি রূপান্তর না করার পরামর্শ দিই। এক্সএমএলকে একটি বস্তুতে রূপান্তর করুন, তারপরে অবজেক্ট থেকে জেএসএন-তে রূপান্তর করুন।

আমার মতে, এটি এক্সএমএল এবং জেএসএন কীভাবে সংযুক্ত হয় তার একটি পরিষ্কার সংজ্ঞা দেয়।

সঠিক হয়ে উঠতে সময় লাগে এবং এটির কিছু উত্পন্ন করার জন্য আপনি এমনকি সরঞ্জামগুলি লিখতে পারেন, তবে এটি মোটামুটি চেহারা দেখতে হবে:

class Channel:
  def __init__(self)
    self.items = []
    self.title = ""

  def from_xml( self, xml_node ):
    self.title = xml_node.xpath("title/text()")[0]
    for x in xml_node.xpath("item"):
      item = Item()
      item.from_xml( x )
      self.items.append( item )

  def to_json( self ):
    retval = {}
    retval['title'] = title
    retval['items'] = []
    for x in items:
      retval.append( x.to_json() )
    return retval

class Item:
  def __init__(self):
    ...

  def from_xml( self, xml_node ):
    ...

  def to_json( self ):
    ...

2

আমি সাধারণ এক্সএমএল স্নিপসের জন্য পেয়েছি, নিয়মিত অভিব্যক্তি ব্যবহার করা ঝামেলা বাঁচায়। উদাহরণ স্বরূপ:

# <user><name>Happy Man</name>...</user>
import re
names = re.findall(r'<name>(\w+)<\/name>', xml_string)
# do some thing to names

এক্স ড্যান্স পার্সিং করে এটি করার জন্য, যেমন @ ড্যান বলেছে যে, ডেটা পৃথক হওয়ার কারণে এককভাবে সব সমাধান নেই। আমার পরামর্শ হল lxML ব্যবহার করা। যদিও জসন থেকে শেষ না হলেও, lxML.objectify শান্ত ভাল ফলাফল দেয়:

>>> from lxml import objectify
>>> root = objectify.fromstring("""
... <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
...   <a attr1="foo" attr2="bar">1</a>
...   <a>1.2</a>
...   <b>1</b>
...   <b>true</b>
...   <c>what?</c>
...   <d xsi:nil="true"/>
... </root>
... """)

>>> print(str(root))
root = None [ObjectifiedElement]
    a = 1 [IntElement]
      * attr1 = 'foo'
      * attr2 = 'bar'
    a = 1.2 [FloatElement]
    b = 1 [IntElement]
    b = True [BoolElement]
    c = 'what?' [StringElement]
    d = None [NoneElement]
      * xsi:nil = 'true'

1
তবে এটি সদৃশ নোডগুলি সরিয়ে দেয়
পুয়া

2

যদিও এক্সএমএল পার্সিংয়ের জন্য অন্তর্নির্মিত লিবস বেশ ভাল তবে আমি আংশিক lxML

তবে আরএসএস ফিডগুলি বিশ্লেষণের জন্য, আমি ইউনিভার্সাল ফিড পার্সারের সুপারিশ করব, এটি পরমাণুকে পার্স করতে পারে। এর প্রধান সুবিধা হ'ল এটি এমনকি বেশিরভাগ ত্রুটিযুক্ত ফিড হজম করতে পারে।

পাইথন ২.6 এর মধ্যে ইতিমধ্যে একটি জেএসএন পার্সার রয়েছে, তবে উন্নত গতির একটি নতুন সংস্করণ সিম্পজসন হিসাবে উপলভ্য

এই সরঞ্জামগুলির সাহায্যে আপনার অ্যাপ্লিকেশনটি তৈরি করা এত কঠিন হওয়া উচিত নয়।


2

আমার উত্তরটি সুনির্দিষ্ট (এবং কিছুটা সাধারণ) কে সম্বোধন করে যেখানে আপনাকে পুরো এক্সএমএলকে জসনতে রূপান্তর করতে হবে না , তবে আপনাকে যা প্রয়োজন তা হল এক্সএমএলের নির্দিষ্ট অংশগুলি অতিক্রম / অ্যাক্সেস করা এবং আপনার এটি দ্রুত হওয়া দরকার এবং সরল (জসন / ডিক্ট-এর মতো ক্রিয়াকলাপগুলি ব্যবহার করে)।

অভিগমন

এর জন্য, এটি লক্ষ্য করা গুরুত্বপূর্ণ যে এক্স্রি ব্যবহার করে একটি এক্সএমএল পার্স lxmlকরা অতি দ্রুত is অন্যান্য উত্তরের বেশিরভাগ ধীর গতির অংশটি দ্বিতীয় পাস: এট্রি কাঠামোকে অনুসরণ করে (সাধারণত পাইথন-জমিতে), এটি জসনে রূপান্তর করে।

যা আমাকে এই ক্ষেত্রে সবচেয়ে ভালভাবে আবিষ্কার করার পদ্ধতির দিকে নিয়ে যায়: এক্সএমএল ব্যবহার করে পার্সিং lxml, এবং তারপরে এট্রি নোডগুলি (অলসভাবে) মোড়ানো, তাদের ডিকের মতো ইন্টারফেস সরবরাহ করে।

কোড

কোডটি এখানে:

from collections import Mapping
import lxml.etree

class ETreeDictWrapper(Mapping):

    def __init__(self, elem, attr_prefix = '@', list_tags = ()):
        self.elem = elem
        self.attr_prefix = attr_prefix
        self.list_tags = list_tags

    def _wrap(self, e):
        if isinstance(e, basestring):
            return e
        if len(e) == 0 and len(e.attrib) == 0:
            return e.text
        return type(self)(
            e,
            attr_prefix = self.attr_prefix,
            list_tags = self.list_tags,
        )

    def __getitem__(self, key):
        if key.startswith(self.attr_prefix):
            return self.elem.attrib[key[len(self.attr_prefix):]]
        else:
            subelems = [ e for e in self.elem.iterchildren() if e.tag == key ]
            if len(subelems) > 1 or key in self.list_tags:
                return [ self._wrap(x) for x in subelems ]
            elif len(subelems) == 1:
                return self._wrap(subelems[0])
            else:
                raise KeyError(key)

    def __iter__(self):
        return iter(set( k.tag for k in self.elem) |
                    set( self.attr_prefix + k for k in self.elem.attrib ))

    def __len__(self):
        return len(self.elem) + len(self.elem.attrib)

    # defining __contains__ is not necessary, but improves speed
    def __contains__(self, key):
        if key.startswith(self.attr_prefix):
            return key[len(self.attr_prefix):] in self.elem.attrib
        else:
            return any( e.tag == key for e in self.elem.iterchildren() )


def xml_to_dictlike(xmlstr, attr_prefix = '@', list_tags = ()):
    t = lxml.etree.fromstring(xmlstr)
    return ETreeDictWrapper(
        t,
        attr_prefix = '@',
        list_tags = set(list_tags),
    )

এই প্রয়োগটি সম্পূর্ণ নয়, উদাহরণস্বরূপ, এটি এমন কোনও ক্ষেত্রে পরিষ্কারভাবে সাপোর্ট করে না যেখানে কোনও উপাদানের পাঠ্য এবং বৈশিষ্ট্য, বা পাঠ্য এবং শিশু উভয়ই থাকে (কেবল কারণ যখন এটি লেখার সময় আমার প্রয়োজন হয়নি ...) এটি সহজ হওয়া উচিত যদিও এটি উন্নতি করতে।

গতি

আমার নির্দিষ্ট ব্যবহারের ক্ষেত্রে, যেখানে আমার কেবলমাত্র এক্সএমএলের নির্দিষ্ট উপাদানগুলি প্রক্রিয়া করার প্রয়োজন ছিল, এই পদ্ধতিটি @ মার্টিন ব্লচের এক্সএমল্টডিক্ট ব্যবহার করার এবং তারপরে ডিককে সরাসরি অনুসরণ করার তুলনায় (০ (!) ফ্যাক্টর দ্বারা একটি আশ্চর্যজনক এবং আকর্ষণীয় স্পিডআপ দিয়েছে

বোনাস

বোনাস হিসাবে, যেহেতু আমাদের কাঠামো ইতিমধ্যে ডিক্ট-এর মতো, তাই আমরা xml2jsonনিখরচায় আরও একটি বিকল্প বাস্তবায়ন পাই । আমাদের কেবল আমাদের ডিকের মতো কাঠামোটি পাস করতে হবে json.dumps। কিছুটা এইরকম:

def xml_to_json(xmlstr, **kwargs):
    x = xml_to_dictlike(xmlstr, **kwargs)
    return json.dumps(x)

যদি আপনার এক্সএমএলটিতে বৈশিষ্ট্যগুলি অন্তর্ভুক্ত থাকে attr_prefixতবে কীগুলি বৈধ জেসন কীগুলি নিশ্চিত করার জন্য আপনাকে কিছু অক্ষর (যেমন "এটিটিআর_") ব্যবহার করতে হবে।

আমি এই অংশটি মানি না।


যদি আমি json.dumps(tree)এটির চেষ্টা করে দেখি তবে 'ETreeDictWrapper' টাইপের অবজেক্টটি JSON সিরিয়ালযোগ্য নয়
ভ্লাদ টি।

2

আমি যখন পাইথনে এক্সএমএল দিয়ে কিছু করি তখন আমি প্রায় সর্বদা lxML প্যাকেজটি ব্যবহার করি। আমি সন্দেহ করি যে বেশিরভাগ লোক lxML ব্যবহার করে। আপনি xmltodict ব্যবহার করতে পারেন তবে আপনাকে আবার এক্সএমএল পার্স করার শাস্তি দিতে হবে।

আপনাকে এক্সএক্সএমএলকে জেসনতে এলএক্সএমএল রূপান্তর করতে:

  1. এলএক্সএমএল সহ এক্সএমএল নথি পার্স করুন
  2. LxML কে ডিকিতে রূপান্তর করুন
  3. তালিকাটি জসন-এ রূপান্তর করুন

আমি আমার প্রকল্পগুলিতে নিম্নলিখিত ক্লাসটি ব্যবহার করি। টজসন পদ্ধতিটি ব্যবহার করুন।

from lxml import etree 
import json


class Element:
    '''
    Wrapper on the etree.Element class.  Extends functionality to output element
    as a dictionary.
    '''

    def __init__(self, element):
        '''
        :param: element a normal etree.Element instance
        '''
        self.element = element

    def toDict(self):
        '''
        Returns the element as a dictionary.  This includes all child elements.
        '''
        rval = {
            self.element.tag: {
                'attributes': dict(self.element.items()),
            },
        }
        for child in self.element:
            rval[self.element.tag].update(Element(child).toDict())
        return rval


class XmlDocument:
    '''
    Wraps lxml to provide:
        - cleaner access to some common lxml.etree functions
        - converter from XML to dict
        - converter from XML to json
    '''
    def __init__(self, xml = '<empty/>', filename=None):
        '''
        There are two ways to initialize the XmlDocument contents:
            - String
            - File

        You don't have to initialize the XmlDocument during instantiation
        though.  You can do it later with the 'set' method.  If you choose to
        initialize later XmlDocument will be initialized with "<empty/>".

        :param: xml Set this argument if you want to parse from a string.
        :param: filename Set this argument if you want to parse from a file.
        '''
        self.set(xml, filename) 

    def set(self, xml=None, filename=None):
        '''
        Use this to set or reset the contents of the XmlDocument.

        :param: xml Set this argument if you want to parse from a string.
        :param: filename Set this argument if you want to parse from a file.
        '''
        if filename is not None:
            self.tree = etree.parse(filename)
            self.root = self.tree.getroot()
        else:
            self.root = etree.fromstring(xml)
            self.tree = etree.ElementTree(self.root)


    def dump(self):
        etree.dump(self.root)

    def getXml(self):
        '''
        return document as a string
        '''
        return etree.tostring(self.root)

    def xpath(self, xpath):
        '''
        Return elements that match the given xpath.

        :param: xpath
        '''
        return self.tree.xpath(xpath);

    def nodes(self):
        '''
        Return all elements
        '''
        return self.root.iter('*')

    def toDict(self):
        '''
        Convert to a python dictionary
        '''
        return Element(self.root).toDict()

    def toJson(self, indent=None):
        '''
        Convert to JSON
        '''
        return json.dumps(self.toDict(), indent=indent)


if __name__ == "__main__":
    xml='''<system>
    <product>
        <demod>
            <frequency value='2.215' units='MHz'>
                <blah value='1'/>
            </frequency>
        </demod>
    </product>
</system>
'''
    doc = XmlDocument(xml)
    print doc.toJson(indent=4)

বিল্ট ইন মেন থেকে আউটপুটটি হ'ল:

{
    "system": {
        "attributes": {}, 
        "product": {
            "attributes": {}, 
            "demod": {
                "attributes": {}, 
                "frequency": {
                    "attributes": {
                        "units": "MHz", 
                        "value": "2.215"
                    }, 
                    "blah": {
                        "attributes": {
                            "value": "1"
                        }
                    }
                }
            }
        }
    }
}

যা এই এক্সএমএলটির রূপান্তর:

<system>
    <product>
        <demod>
            <frequency value='2.215' units='MHz'>
                <blah value='1'/>
            </frequency>
        </demod>
    </product>
</system>



1

lxML2json দেখুন (প্রকাশ: আমি এটি লিখেছি)

https://github.com/rparelius/lxml2json

এটি খুব দ্রুত, লাইটওয়েট (কেবলমাত্র lxML প্রয়োজন) এবং এর একটি সুবিধা হ'ল নির্দিষ্ট উপাদানগুলিকে তালিকাগুলিতে বা ডিক্টে রূপান্তরিত করা হয় কিনা তার উপর আপনার নিয়ন্ত্রণ রয়েছে


1

আপনি ডিক্লেক্সএমএল ব্যবহার করতে পারেন। এটিতে বহু বৈশিষ্ট্য এবং জটিল নেস্টেড সহায়তার মতো উন্নত বৈশিষ্ট্য রয়েছে। আপনার কেবল এটির জন্য একটি সাধারণ প্রসেসর লিখতে হবে। একই কোড সহ, আপনি আবার JSON এ রূপান্তর করতে পারেন। এটি মোটামুটি সোজা এবং ডকুমেন্টেশন দুর্দান্ত।

লিঙ্ক: https://declxml.readthedocs.io/en/latest/index.html


-1

পাইথনে ডেটা প্রস্তুত করুন : জেএসওএন তৈরি করতে প্রথমে আপনাকে পাইথনে ডেটা প্রস্তুত করতে হবে। আমরা ডেথ প্রস্তুত করতে পাইথনে তালিকা এবং অভিধান ব্যবহার করতে পারি।

পাইথন তালিকা <==> জেএসওন অ্যারে

পাইথন অভিধান <==> জেএসওএন অবজেক্ট (মূল মান ফর্ম্যাট) আরও বিশদে এটি পরীক্ষা করে দেখুন

https://devstudioonline.com/article/create-json-and-xml-in-python


স্ট্যাক ওভারফ্লোতে স্বাগতম! লিঙ্কগুলি জ্ঞান ভাগ করে নেওয়ার দুর্দান্ত উপায়, ভবিষ্যতে যদি তারা ভাঙা যায় তবে তারা সত্যই প্রশ্নের উত্তর দেবে না। আপনার উত্তরে লিঙ্কটির প্রয়োজনীয় সামগ্রীটি যুক্ত করুন যা প্রশ্নের উত্তর দেয়। যদি বিষয়বস্তু এখানে জটিল বা খুব বেশি ফিট হয় তবে প্রস্তাবিত সমাধানটির সাধারণ ধারণাটি বর্ণনা করুন। মূল সমাধানের ওয়েবসাইটে সর্বদা একটি লিঙ্কের রেফারেন্স রাখতে ভুলবেন না। দেখুন: আমি কীভাবে ভাল উত্তর লিখব?
সুনুন ןɐ কিউপি

-4

JSON ফর্ম্যাটে ডেটা উপস্থাপন করতে

name=John
age=20
gender=male
address=Sector 12 Greater Kailash, New Delhi
Jobs=Noida,Developer | Gurugram,Tester |Faridabad,Designer

ইন JSON আমরা কী এবং মান বিন্যাসে একটি ডাটা repesent

{
    "name":"john",
    "age":20,
    "gender":"male",
    "address":["New kP college","Greater Kailash","New Delhi"],
    "jobs":[
               {"Place":"Noida","Title":"Developer "},
               {"Place":"Gurugram","Title":"Tester "},
               {"Place":"Faridabad","Title":"Designer"}
           ]
}

এক্সএমএল ফর্ম্যাটে ডেটা উপস্থাপন করতে

<!-- In xml we write a code under a key you can take any key -->
<info> <!-- key open -->

<name> john </name> 
<age> 20 </age>
<gender> male </gender>

<address> 
<item> New kP college </item>
<item> Greater Kailash </item>
<item> New Delhi </item>
</address>

<jobs>
 <item>
  <title>Developer </title>
  <place>Noida</place>
 </item>

 <item>
  <title>Designer</title>
  <place>Gurugram</place>
 </item>
 
 <item>
  <title>Developer </title>
  <place>Faridabad</place>
 </item>
</jobs>

</info> <!-- key close-->

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.