将类与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)
- 首次公开发行