当前位置:  开发笔记 > 编程语言 > 正文

如何在Python中将XML转换为JSON?

如何解决《如何在Python中将XML转换为JSON?》经验,为你挑选了4个好方法。

xmltodict(全面披露:我写的)可以帮助你的XML转换为一个字典+列表+弦结构,下面这个"标准".它是基于Expat的,所以它非常快,不需要在内存中加载整个XML树.

拥有该数据结构后,可以将其序列化为JSON:

import xmltodict, json

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

xmltodict似乎有一个"unsarse"方法,现在将执行反向操作 (5认同)

你写过逆?我想,我会对这种动物感兴趣. (3认同)


Anton I. Sip.. 26

Soviut对lxml客体化的建议很好.使用特殊的子类simplejson,您可以将lxml objectify结果转换为json.

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("1.50W. Shakespeare")       
      >>> 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,基本上您将lxml的结果传递objectify给实例的encode方法objectJSONEncoder

请注意,Koen的观点在这里非常有效,上面的解决方案仅适用于简单嵌套的xml,并且不包括根元素的名称.这可以修复.

我在这里列出了这个课程:http://gist.github.com/345559



1> Martin Blech..:

xmltodict(全面披露:我写的)可以帮助你的XML转换为一个字典+列表+弦结构,下面这个"标准".它是基于Expat的,所以它非常快,不需要在内存中加载整个XML树.

拥有该数据结构后,可以将其序列化为JSON:

import xmltodict, json

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


xmltodict似乎有一个"unsarse"方法,现在将执行反向操作
你写过逆?我想,我会对这种动物感兴趣.

2> Anton I. Sip..:

Soviut对lxml客体化的建议很好.使用特殊的子类simplejson,您可以将lxml objectify结果转换为json.

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("1.50W. Shakespeare")       
      >>> 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,基本上您将lxml的结果传递objectify给实例的encode方法objectJSONEncoder

请注意,Koen的观点在这里非常有效,上面的解决方案仅适用于简单嵌套的xml,并且不包括根元素的名称.这可以修复.

我在这里列出了这个课程:http://gist.github.com/345559


如果我的标签有几个具有相同标签名称的子项怎么办?

3> Koen Bok..:

我认为XML格式可以如此多样化,如果没有非常严格的XML格式,就不可能编写可以做到这一点的代码.这就是我的意思:


    
        Koen Bok
        26
    
    
        Plutor Heidepeen
        33
    

会成为

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

但这会是什么:


    
        
            
        
    

明白了吗?

编辑:刚刚发现这篇文章:http://www.xml.com/pub/a/2006/05/31/converting-between-xml-and-json.html


@George这篇文章是关于往返XML和JSON的一般问题.这与这个话题密切相关.不要让JavaScript代码最终让你失望.

4> Jeff Bauer..:

Jacob Smullyan编写了一个名为pesterfish的实用程序,它使用effbot的ElementTree将XML转换为JSON.

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有