2011-06-24 34 views
6

Tengo un archivo XML que quiero convertir a un archivo JSON usando python, pero no funciona para mí.¿Cómo puedo convertir un archivo xml en JSON usando Python?

<?xml version="1.0"?> 
<note> 
    <to>Tove</to> 
    <from>Jani</from> 
    <heading>Reminder</heading> 
    <body>Don't forget me this weekend!</body> 
</note> 

El archivo XML anterior estoy usando el análisis sintáctico elementtree y dándole a simplejson para serializar así:

from xml.etree import ElementTree as ET 
import simplejson 

tree = ET.parse(Xml_file_path) 
simplejson.dumps(tree) 

Me da un error: TypeError: xml.etree.ElementTree.ElementTree objeto en 0x00C49DD0 no es serializable por JSON.

+1

Debe comprender que el objeto árbol de elementos no es una representación completa del archivo XML, solo proporciona métodos para acceder a las partes del archivo XML que desee. La respuesta para usar el módulo xml2json satisfará sus necesidades. – razzmataz

Respuesta

7

Esto es probablemente lo que busca:

https://github.com/mutaku/xml2json

import xml2json 

s = '''<?xml version="1.0"?> 
<note> 
    <to>Tove</to> 
    <from>Jani</from> 
    <heading>Reminder</heading> 
    <body>Don't forget me this weekend!</body> 
</note>''' 
print xml2json.xml2json(s) 
15

Otra opción es xmltodict (información completa: lo escribí). Puede ayudarlo a convertir su XML en una estructura dict + list + string, siguiendo este "standard". Está basado en Expat, por lo que es muy rápido y no necesita cargar todo el árbol XML en la memoria.

Una vez que tenga esa estructura de datos, puede serializar a JSON:

import xmltodict, json 

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

se puede tratar de utilizar xmljson. El código para el mismo es

from xmljson import badgerfish as bf 
from xml.etree.ElementTree import fromstring 
s = '''<?xml version="1.0"?> 
<note> 
    <to>Tove</to> 
    <from>Jani</from> 
    <heading>Reminder</heading> 
    <body>Don't forget me this weekend!</body> 
</note>''' 
json.dumps(bf.data(fromstring(s))) 
Cuestiones relacionadas