跳转到主要内容

以声明方式将类与lxml XML元素关联。

项目描述

Classix

简介

Classix是在lxml的自定义元素类功能之上的一个薄层,允许你声明性地配置它们。它使用Martian来实现这一效果,但对于你来说,这应该是一个实现细节。

要解析XML文档,你需要一个解析器。可以通过配置自定义元素类来配置XMLParser,这些类将在解析后与XML文档中的正确元素关联。这样,你可以丰富你的XML文档的内容模型。

方法

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

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

现在我们可以解析这个包中的解析器

>>> 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'

无命名空间

有时,你可能想将一个类与没有命名空间的元素关联起来。为此,你可以明确地将命名空间设置为None

>>> 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'

如果没有使用classix.namespace指令,则假定命名空间为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)

  • 初始公开发布

下载

项目详情


发布历史 发布通知 | RSS订阅

下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

classix-0.5.tar.gz (3.9 kB 查看哈希值)

上传时间 源代码

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页