将类与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 Android Action_Edit Intent无法像以前一样调用App Gallery来编辑图片   确保JRE兼容性的java适当程序(32或64位)   java JSONArray。for循环中的add(JSONObject)正在替换for循环中的旧值,数组由循环中的最后一个值组成   java需要帮助创建一个返回数组的方法,该数组的元素是另一个数组的平方   使用SmbFile w/groovy XmlSluper()创建xml。解析()Java   检查大小后的java ArrayIndexOutOfBoundsException   乘法表中的第k个最小元素   java 401 on请求,其中指定了'permitAll()'   java如何附加ORC文件   java hibernate类模型   java IDEA没有看到由自定义注释处理器生成的方法   Servlet中未声明java SerialVersionId   java linkedlist到达列表末尾时   java如何正确对齐EditText光标?   java 6编译器1.6上的eclipse重写方法错误   java如何在基于Jersey的RESTful Web服务中读取post数据   java如何在活动中正确使用接口?   Java的JIT编译器的工作速度有多快?