2016-04-06 22 views
0

私はJava、C++、Delphiから来ています。今はPythonの小さなプロジェクトに取り組んでいます。これまでのところ私はほとんどの問題を解決することができましたが、未解決の問題がありました:Pythonオブジェクトの型キャストとXML

XMLノードのメソッドgetAttribute()をext_xml_nodeに型キャストして置き換えたい/上書きするだけです。プロジェクトは新しいgetAttributeを使用します。私が読むことができる限り、実際の型キャスト(C++のような)はPythonでは不可能なので、特定の関数(xmlノード引数を持つディスパッチャのような他のサブ関数を呼び出す)で考えようとしました。新しいクラス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

あなたが求めていることは完全にはっきりしていません。あなたの質問を示す短くて完全なスタンドアロンプ​​ログラムを制作できますか?詳細は、[mcve]を参照してください。 –

答えて

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 
+0

答えをありがとう、私はそれを使用しようとします –

関連する問題