我来自Java,C ++和Delphi,现在我正在开发一个Python的小项目。到目前为止,我可以解决大多数问题,但我已经解决了以下问题:
我只想通过将xml节点类型转换为ext_xml_node来替换/覆盖XML节点的方法getAttribute(),以便前面提到的项目的每个函数都使用新的getAttribute。据我所知,在python中无法实现真正的类型转换(如C ++等),所以我想到了某些函数(调用其他子函数,如带有xml节点参数的调度程序)a对新类ext_xml_node
的参数的类型转换class ext_xml_node(xml_node): ... def getAttribute(self, name): unhandled_value = super...(name) handled_value= dosomethingiwth(unhandled_value) return handled_value def dispatcher(self, xml_node): for child_node in xml_node.childNodes: if child_node.nodeName == 'setvariable': bla = ext_xml_node(child_node) self.handle_setvariable_statement(bla) def handle_setvariable_statement(xml_node): varname= xml_node.getAttribute("varname") # Now it should call ext_xml_node.getAttribute Method
我不想在这个项目中替换每个getAttribute函数,并且有另一种方法(鸭子输入肯定不起作用)或者我应该在每个属性上写一个具有该产量的函数 - 以及如何?
答案 0 :(得分:0)
lxml提供了适合您需求的自定义元素类。
xml = '''\
<?xml version="1.0" encoding="utf-8"?>
<root xmlns="http://example.com">
<element1>
<element2/>
</element1>
</root>'''
from lxml import etree
class MyXmlClass1(etree.ElementBase):
def getAttribute(self):
print '1'
class MyXmlClass2(etree.ElementBase):
def getAttribute(self):
print '2'
nsprefix = '{http://example.com}'
fallback = etree.ElementDefaultClassLookup(element = MyXmlClass1)
lookup = etree.ElementNamespaceClassLookup(fallback)
parser = etree.XMLParser()
parser.set_element_class_lookup(lookup)
namespace = lookup.get_namespace('http://example.com')
namespace['element2'] = MyXmlClass2
root = etree.XML(xml, parser)
root.getAttribute()
>>> 1
element1 = root.getchildren()[0]
element1.getAttribute()
>>> 1
element2 = element1.getchildren()[0]
element2.getAttribute()
>>> 2