以声明方式将类与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)
初始公开发布
下载
项目详情
关闭
classix-0.5.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e0806f4968b9e6d8f6ddc198a5dd0c7c257151495af41d23e18f5ef0e17ca421 |
|
MD5 | 7d5fd66cc165e3e6c4935569d02bf977 |
|
BLAKE2b-256 | a824e79ce511815cedd55cb89f9c8208ee73bb04eb5029cb14d7c51ff3a6420e |