最简单的python对象xml映射器。配合lxml。
lxml-mate的Python项目详细描述
什么是lxml mate?
最简单的python xml对象映射器,由lxml提供支持。它很强大。
定义XML文档的结构不需要类定义。
您可以创建一个全新的xml,或者从string、xml文档创建并以非常python的方式处理它。
有关更多文档,请参见源代码。
功能
当访问一个不存在的标签以便更容易地访问时,p> ^ {STR 1 } $截获属性错误< /强>。对于ExMaple:
>>> s = ''' ... <root> ... <person height='180cm'> ... <name>jack</name> ... <age>18</age> ... </person> ... <person> ... <name>peter</name> ... </person> ... </root> >>> '''
当我们访问第二个人的年龄时,lxml.objectify.objectifiedelement将引发属性错误。lxml mate将创建一个空节点,而不是引发异常。
lxml:
>>> r = objectify.fromstring( s ) >>> ages = [ ( p.name, p.age ) for p in r.person ] #AttributeError be raised. >>> r.person[0].else.mother = 'jerry' #AttributeError be raised.
lxml配对:
>>> r = ObjectifiedElementProxy( xmlstr = s ) >>> ages = [ ( p.name.pyval, p.age.pyval ) for p in r.person[:] ] #dose work >>> r.person[0].else.mother = 'jerry' #dose work
用法
创建
创建新的xml,如:
<root> <person height='180cm'> <name>jack</name> <age>18</age> </person> </root>
lxml:
>>> from lxml import objectify, etree >>> r = objectify.Element('root') >>> person = objectify.SubElement( r, 'person', attrib={'height':'180cm'} ) >>> name = objectify.SubElement( person, 'name' ) >>> person.name = 'jack' >>> age = objectify.SubElement( person, 'age' ) >>> person.age = 18
或使用e-factory
>>> E = objectify.E >>> E.root( E.person( E.name('jack'), E.age(18), height='180cm' ) )
lxml配对:
>>> from lxmlmate import ObjectifiedElementProxy >>> rm = ObjectifiedElementProxy( rootag='root' ) >>> rm.append( E.person( E.name('jack'), E.age(18), height='180cm' ) )
或
>>> rm = ObjectifiedElementProxy( objectifiedElement = E.root( E.person( E.name('jack'), E.age(18), height='180cm', height='180cm' ) ) )
或
>>> rm = ObjectifiedElementProxy( rootag='root' ) >>> rm.person.name = 'jack' >>> rm.person.age = 18 >>> rm.person.attrib[ 'height' ] = '180cm'
附加
附加XML片段,如:
>>> <person> <name>peter</name> <age>45</age> </person> <person> <name>joe</name> <age>25</age> </person>
lxml:
>>> r.append( E.person( E.name( 'peter' ), E.age( 45 ) ), ... E.person( E.name( 'joe' ), E.age( 25 ) ) ... ) >>>
lxml配对:
>>> rm.append( E.person( E.name( 'peter' ), E.age( 45 ) ), ... E.person( E.name( 'joe' ), E.age( 25 ) ) ... ) >>>
或
>>> rm.insert( 'person', i=None )( 'name', 'peter' )( 'age', 45 ) >>> rm.insert( 'person', i=None )( 'name', 'joe' )( 'age', 25 )
选择
lxml:
选择最后一个人(名为Joe):
>>> r.person[-1] #return an ObjectifiedElement instance.
查找名为Joe的人:
>>> r.xpath( '//person[name="joe"]' ) #return ObjectifiedElement instances list
lxml配对:
>>> rm.person[-1] #return an ObjectifiedElementProxy instance. >>> rm.xpath( '//person[name="joe"]' ) #return ObjectifiedElementProxy objects list
移除
删除所有名为Joe的人:
lxml:
>>> p = r.xpath( '//person[name="joe"]' ) >>> for k in p: r.remove( k )
lxml配对:
>>> pm = rm.xpath( '//person[name="joe"]' ) >>> rm.remove( pm )
或
>>> rm.remove( [ p for p in rm.person[:] if p.name.pyval == 'joe' ] )
删除第一个人:
lxml:
>>> p = r.person[0] >>> r.remove( p )
lxml配对:
>>> rm.remove( 0 )
转储到文件
lxml:
>>> f = open( 'person.xml', 'w' ) >>> s = etree.tostring( r ) >>> f.write( s ) >>> f.close()
lxml配对:
>>> rm.dump( 'person.xml' )
从文件加载
lxml:
>>> r = objectify.XML( 'person.xml' )
lxml配对:
>>> rm = ObjectifiedElementProxy( xmlFile = 'person.xml' )
创建一个全新的xml
lxml:
>>> r = objectify.Element('root')
lxml配对:
>>> rm = ObjectifiedElementProxy( rootag='root' )
否则
要访问标记:
>>> rm.person[0] >>> rm[ 'person' ][0] >>> rm.person >>> rm.person[ 'name' ]
修改标记的值:
>>> rm.person.age = 23
要获取标记的PyVal:
>>> rm.person.age.pyval
修改标记的属性:
>>> rm.person[0].attrib['height'] = "170cm"
修改标记:
>>> rm.person[-1].tag = 'people'
清除空节点(没有属性和子节点):
>>> rm.clean()
您可以直接使用lxml.objectify.objectifiedelement的方法,如下所示:
>>> rm.addattr( 'kkk','vvv' )
依赖关系
安装
>>> pip install lxml-mate
更改日志
0.5.3(2015-07-20)
- 修复objectifiedelementproxy(xmlfilename='…')错误。
0.5.2(2015-07-10)
- 添加xpath方法。
- 改进文档和自述文件。
0.5.0(2015-06-29)
- 首次公开发行。