Python对象类型转换和XML

时间:2016-04-06 16:18:27

标签: python xml object casting

我来自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函数,并且有另一种方法(鸭子输入肯定不起作用)或者我应该在每个属性上写一个具有该产量的函数 - 以及如何?

1 个答案:

答案 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