Mappet
has been created to enable an easy an intuitive way to work with XML structures in Python code.
A well known lxml
module has been used under the hood, mainly due to XML parsing performance.
Mappet accepts a string with valid XML, an lxml.etree._Element
object or a dict representing the XML tree.
>>> from mappet import mappet >>> f = open('example.xml', 'r') >>> m = mappet.Mappet(f.read())
As an example, an XML document of the following structure has been used:
<?xml version='1.0' encoding='iso-8859-2'?> <a-message> <head> <id seq="20" tstamp="2015-07-13T10:55:25+02:00"/> <initiator>Mr Sender</initiator> <date>2015-07-13T10:56:05.597420+02:00</date> <type>reply-type</type> </head> <auth> <user first-name="Name" last-name="LastName">id</user> </auth> <status> <result>OK</result> </status> <reply> <cars> <Car> <id>12345</id> <Manufacturer>BMW</Manufacturer> <Model_Name>X6</Model_Name> <Body>SUV</Body> <Fuel>Diesel</Fuel> <Doors>5</Doors> <ccm>3000</ccm> <HP>256</HP> <TransType>Automatic</TransType> <seats>5</seats> <weight>3690</weight> </Car> <Car> <id>54321</id> <Manufacturer>BMW</Manufacturer> <Model_Name>X1</Model_Name> <Body>SUV</Body> <Fuel>Diesel</Fuel> <Doors>5</Doors> <ccm>3000</ccm> <HP>198</HP> <TransType>Automatic</TransType> <seats>5</seats> <weight>2890</weight> </Car> </cars> </reply> </a-message>
Every XML node can be accessed in two ways: by attribute and item access.
Dictionary access is possible thanks to XML document being represented as a Python dictionary. Conversion of values is done explicitly.
By default, values are returned as str
.
>>> m['reply']['cars']['Car'][0]['Manufacturer'] 'BMW'
Nodes' names are case-sensitive.
Due to restrictions in Python variable names, tag names are normalized for attribute access. Tag names are normalized to lowercase and hyphens to underlines.
Same example using attribute access (__repr__ is responsible for representing the tag):
>>> m.reply.cars.car[0].manufacturer BMW
To get a string representation use get()
.
>>> m.reply.cars.car[0].manufacturer.get() 'BMW'
Metoda ta posiada dwa parametry default oraz callback. Parametr default zwracany jest gdy wartość węzła jest pusta, natomiast callback jest funkcją która ma być wykonana na zwracanej wartości.
>>> m.reply.cars.car[0].ccm.get(callback=int) 3000
Alternatively, one can use built-in helper functions, defined in helpers.py
>>> m.reply.cars.car[0].ccm.to_int() 3000
- to_bool
- to_int
- to_str
- to_string
- to_float
- to_time
- to_datetime
- to_date