最简单的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第三方库


热门话题
java获取JEditorPane中字符的绝对位置   java Datetime:将时间段拆分为天、小时和分钟   java是使此HashMap更高效的一种方法   java项目reactor:collectList()之后的block()对Flux不起作用。创建()   java在Mac OSX上安装OpenCV   java递归地确定一组数字是否包含两个总和相等的子集   Quad2D曲线上的几何图形Java绘图箭头   java将SSL证书导入Glassfish 4。十、   java Android未找到处理Intent MediaScanner的活动   EclipseJava。安全cert.CertificateParsingException:java。木卫一。IOException:主题密钥,无法创建EC公钥   java我能在O(M log N)时间内完成吗?   java跟踪eclipse中的资源更改也在中。元数据和。项目   java如何完全禁用Android键盘   java返回到上一个活动