将类与lxml元素关联的声明性方法。

classix的Python项目详细描述


Classix

简介

Classix是LXML的custom element classes上的一个薄层 用于以声明方式配置它们的功能。它使用 Martian来实现这个效果,但对您来说,这应该是 实施细节。

要解析XML文档,您需要一个解析器。xmlparser`可以是 使用将与 解析后XML文档中的正确元素。这样你就可以 丰富XML文档的内容模型。

方法

首先我们需要对这个包进行配置。这只需要 对这个包裹发生一次。首先,我们需要设置一个GrokkerRegistry

>>> import martian
>>> reg = martian.GrokkerRegistry()

现在我们可以在这个包中搜索grokker:

>>> from classix import meta
>>> reg.grok('meta', meta)
True

现在我们可以开始使用Classix了。你需要创建一个XMLParser 将自定义元素类与之关联的类:

>>> import classix
>>> class MyParser(classix.XMLParser):
...     pass

让我们摸索一下解析器:

>>> reg.grok('MyParser', MyParser)
True

现在,您可以设置类来与特定元素相关联 名称空间,对于该解析器:

>>> XMLNS = 'http://ns.example.com'
>>> class Test(classix.Element):
...    classix.namespace(XMLNS)
...    classix.parser(MyParser)
...
...    def custom_method(self):
...        return "The custom method"

我们还需要摸索一下:

>>> reg.grok('Test', Test)
True

现在已经设置好了,我们可以初始化解析器:

>>> parser = MyParser()

让我们分析一点xml:

>>> xml = '''\
...   <test xmlns="http://ns.example.com" />
...   '''
>>> from lxml import etree
>>> root = etree.XML(xml, parser)
>>> root.custom_method()
'The custom method'

没有命名空间

有时您希望将类与 名称空间。这样做,您可以将名称空间设置为“无” 明确:

>>> reg = martian.GrokkerRegistry()
>>> reg.grok('meta', meta)
True

>>> class MyParser(classix.XMLParser):
...     pass
>>> reg.grok('MyParser', MyParser)
True
>>> class Test(classix.Element):
...     classix.namespace(None)
...     classix.parser(MyParser)
...     def custom_method(self):
...        return 'The custom method for no namespace'
>>> reg.grok('Test', Test)
True
>>> parser = MyParser()
>>> no_ns_xml = '''\
...   <test />
...   '''
>>> root = etree.XML(no_ns_xml, parser)
>>> root.custom_method()
'The custom method for no namespace'

当与具有命名空间的元素一起提供时,Test类将 不与该元素关联:

>>> root = etree.XML(xml, parser)
>>> root.custom_method()
Traceback (most recent call last):
  ...
AttributeError: 'lxml.etree._Element' object has no attribute 'custom_method'

如果^{tt5},则假定命名空间为None。$ 完全不使用指令:

>>> class MyParser(classix.XMLParser):
...     pass
>>> reg.grok('MyParser', MyParser)
True
>>> class Test(classix.Element):
...     classix.parser(MyParser)
...     def custom_method(self):
...        return 'The custom method for no namespace 2'
>>> reg.grok('Test', Test)
True
>>> parser = MyParser()
>>> no_ns_xml = '''\
...   <test />
...   '''
>>> root = etree.XML(no_ns_xml, parser)
>>> root.custom_method()
'The custom method for no namespace 2'

解析器中的命名空间

为了方便起见,您还可以在 解析器,作为回退,因此不必在所有 元素类:

>>> reg = martian.GrokkerRegistry()
>>> reg.grok('meta', meta)
True

>>> class MyParserWithNamespace(classix.XMLParser):
...    classix.namespace(XMLNS)
>>> reg.grok('MyParserWithNamespace', MyParserWithNamespace)
True

>>> class Test2(classix.Element):
...    classix.parser(MyParserWithNamespace)
...    classix.name('test') # also override name
...    def custom_method(self):
...        return "Another custom method"
>>> reg.grok('Test2', Test2)
True

>>> parser_ns = MyParserWithNamespace()
>>> root = etree.XML(xml, parser_ns)
>>> root.custom_method()
'Another custom method'

Classix更改

0.5(2008-07-07)

  • 首次公开发行

下载

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

推荐PyPI第三方库


热门话题
java Spring Html表单+Crud操作   java旋转矩阵的逆序   使用ViewPager设置java活动   java刷新库使用MediaScanner连接,文档文件URI从TreeUri获得,用于棒棒糖版本   java如何在存储库中使用mockito测试InternalServerError?   java Spring MVC 3将参数绑定到备份对象   java My cache未使用@CachePut注释进行更新   如何在java中使用Optional为集合中的模型的所有属性检查NOTNULL?   javascript在基于区域设置设置货币时,有没有一种方法可以获得一致的输出   JavaSpring引导AngularJs$http。get是空的   数组如何在java中从段落中查找多组特定单词?   java使用REST执行POST请求如何使用Neo4j   java mvn安装抛出错误“package…不存在”,即使它存在   java Android蓝牙LE连接到心率监视器