最简单的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)

  • 首次公开发行。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
在IE10中重新加载另一个帧时,internet explorer Java小程序失败/消失   ThreadLocal变量的java性能   java系统。出来println不是打印输出   java从JAXB类获取元素属性   java组织。天啊。科尔巴。包裹。InvalidName:IDL:omg。org/CORBA/ORB/InvalidName:1.0   java有没有办法让非事务连接抛出异常?   java是否有任何方法可以使用JdbcTemplate和查询/条件Fluent API   javajpa级联类型。刷新不工作?   未考虑java Maven依赖关系管理   java MySQL MBR包含抛出MySQLExceptionError的语句   java验证整数并将其设为5位数   java发现了循环依赖的问题   java Hibernate left join fetch到使用@ManyToMany关联映射的softdeleted实体生成无效查询?   JavaH:commandButton多个操作:下载文件并呈现ajax表   Google Contacts API在Java、C#、Python或Ruby中是否有一个Hello World示例?