example - ¿Hay algún analizador XML de Python que haya sido diseñado pensando en los seres humanos?
xml python 3 (4)
De hecho, escribí una biblioteca que hace las cosas exactamente de la manera en que lo imaginabas. La biblioteca se llama "xe" y puede obtenerla en:
xe puede importar XML para permitirle trabajar con los datos de forma orientada a objetos. En realidad usa xml.dom.minidom para hacer el análisis, pero luego recorre el árbol resultante y empaqueta los datos en objetos xe.
EDIT: De acuerdo, seguí adelante e implementé su ejemplo en xe, para que pueda ver cómo funciona. Aquí hay clases para implementar el XML que mostró:
import xe
class Node(xe.TextElement):
def __init__(self, text="", value=None):
xe.TextElement.__init__(self, "node", text)
if value is not None:
self.attrs["value"] = value
class Root(xe.NestElement):
def __init__(self):
xe.NestElement.__init__(self, "root")
self.node = Node()
Y aquí hay un ejemplo del uso de lo anterior. Coloqué su muestra XML en un archivo llamado "example.xml", pero también podría ponerlo en una cadena y pasar la cadena.
>>> root = Root()
>>> print root
<root/>
>>> root.import_xml("example.xml")
<Root object at 0xb7e0c52c>
>>> print root
<root>
<node value="30">text</node>
</root>
>>> print root.node.attrs["value"]
30
>>>
Tenga en cuenta que en este ejemplo, el tipo de "valor" será una cadena. Si realmente necesitas atributos de otro tipo, eso también es posible con un poco de trabajo, pero no me molesté en este ejemplo. (Si observas PyFeed, hay una clase para OPML que tiene un atributo que no es texto).
Me gusta Python, pero no quiero escribir 10 líneas solo para obtener un atributo de un elemento. Tal vez sea solo yo, pero el minidom
no es ese mini
. El código que tengo que escribir para analizar algo que lo use se parece mucho al código Java.
¿Hay algo que sea más user-friendly
? ¿Algo con operadores sobrecargados, y que mapea elementos a objetos?
Me gustaría poder acceder a esto:
<root>
<node value="30">text</node>
</root>
como algo como esto:
obj = parse(xml_string)
print obj.node.value
y no usar getChildren
o algún otro método como ese.
Deberías echarle un vistazo a ElementTree . No está haciendo exactamente lo que quieres, pero es mucho mejor que el minidom. Si recuerdo correctamente, a partir de Python 2.4, está incluido en las bibliotecas estándar. Para más velocidad usa cElementTree. Para obtener más velocidad (y más funciones), puede utilizar lxml (consulte la API de lxml para sus necesidades / enfoque).
Debería añadir que BeautifulSoup hace en parte lo que quieras. También está Amara que tiene este enfoque.
Pasé un poco de tiempo repasando los ejemplos proporcionados anteriormente y los repositorios listados en pip.
La forma más fácil (y más Pythonic) de analizar XML que he encontrado hasta ahora ha sido XMLToDict - https://github.com/martinblech/xmltodict
El ejemplo de la documentación disponible en GitHub está copiado y copiado a continuación; Ha hecho la vida MUY simple y FÁCIL para mí muchas veces;
>>> doc = xmltodict.parse("""
... <mydocument has="an attribute">
... <and>
... <many>elements</many>
... <many>more elements</many>
... </and>
... <plus a="complex">
... element as well
... </plus>
... </mydocument>
... """)
>>>
>>> doc[''mydocument''][''@has'']
u''an attribute''
>>> doc[''mydocument''][''and''][''many'']
[u''elements'', u''more elements'']
>>> doc[''mydocument''][''plus''][''@a'']
u''complex''
>>> doc[''mydocument''][''plus''][''#text'']
u''element as well''
Funciona muy bien y me dio justo lo que estaba buscando. Sin embargo, si estás viendo transformaciones inversas, eso es una cuestión completamente diferente.
Tenía la misma necesidad de un analizador XML simple y, después de un largo tiempo dedicado a comprobar diferentes bibliotecas, encontré xmltramp .
Basado en su ejemplo xml:
import xmltramp
xml_string = """<root>
<node value="30">text</node>
</root>"""
obj = xmltramp.parse(xml_string)
print obj.node(''value'') # 30
print str(obj.node) # text
No encontré nada más fácil de usar.