Python对象类型转换和XML 我来自java、C++和Delphi,现在我正在用Python做一个小项目。到目前为止,我可以解决大多数问题,但我有以下问题尚未解决:

Python对象类型转换和XML 我来自java、C++和Delphi,现在我正在用Python做一个小项目。到目前为止,我可以解决大多数问题,但我有以下问题尚未解决:,python,xml,object,casting,Python,Xml,Object,Casting,我只想通过将XML节点强制转换为ext_XML_节点来替换/覆盖XML节点的方法getAttribute(),以便前面提到的项目的每个函数都使用新的getAttribute。就我所知,Python中没有真正的类型转换(例如C++等),所以我提出了在某些函数(例如调用具有XML节点参数的分派器的其他子函数)的想法,它是对新类ExtXXMLL节点的类型的转换。 class ext_xml_node(xml_node): ... def getAttribute(self, name):

我只想通过将XML节点强制转换为ext_XML_节点来替换/覆盖XML节点的方法getAttribute(),以便前面提到的项目的每个函数都使用新的getAttribute。就我所知,Python中没有真正的类型转换(例如C++等),所以我提出了在某些函数(例如调用具有XML节点参数的分派器的其他子函数)的想法,它是对新类ExtXXMLL节点

的类型的转换。 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 类外部xml节点(xml节点): ... def getAttribute(自身,名称): 未处理的_值=超级…(名称) 已处理的\u值=dosomethingiwth(未处理的\u值) 返回值 def调度程序(自身,xml_节点): 对于xml_node.childNodes中的子_节点: 如果child_node.nodeName==“setvariable”: bla=外部xml节点(子节点) self.handle_setvariable_语句(bla) def handle_setvariable_语句(xml_节点): varname=xml_node.getAttribute(“varname”) #现在它应该调用ext_xml_node.getAttribute方法
我不想替换这个项目中的每个getAttribute函数,还有其他方法(duck类型肯定不起作用)吗?或者我真的应该在每个属性上编写一个这样的函数吗?以及如何编写?

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
xml=''\
'''
从lxml导入etree
类MyXmlClass1(etree.ElementBase):
def getAttribute(自身):
打印“1”
类MyXmlClass2(etree.ElementBase):
def getAttribute(自身):
打印“2”
nsprefix={http://example.com}'
fallback=etree.ElementDefaultClassLookup(element=MyXmlClass1)
lookup=etree.ElementNamespaceClassLookup(回退)
parser=etree.XMLParser()
parser.set\u元素\u类\u查找(查找)
名称空间=查找。获取名称空间('http://example.com')
命名空间['element2']=MyXmlClass2
root=etree.XML(XML,解析器)
root.getAttribute()
>>> 1
element1=root.getchildren()[0]
element1.getAttribute()
>>> 1
element2=element1.getchildren()[0]
element2.getAttribute()
>>> 2

您的要求并不完全清楚。您能否制作一个简短、完整、独立的程序来演示您的问题?有关更多信息,请参阅。