2016-04-06 17 views
0

Java, C++ ve Delphi'den geliyorum, şimdi Python'da küçük bir proje üzerinde çalışıyorum. Şimdiye kadar çoğu problemi çözebiliyordum ama çözülmemiş olanlarım var:Python object typecasting ve XML

Sadece xml düğümünü ext_xml_node içine yazarak bir XML Düğümünün getAttribute() yönteminin yerine koymak/üzerine yazmak istiyorum. Proje yeni getAttribute kullanır. Okuyabildiğim kadarıyla, python'da gerçek tipte cast (C++ vb. Gibi) yapmanın bir yolu yoktur, bu yüzden belirli işlevlerde (xml node argümanı olan bir dağıtıcı gibi diğer alt işlevleri çağırır)

 
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 

Ben bu projede her getAttribute işlevini yerine istemiyorum yeni sınıf ext_xml_node için tartışmanın döküm yazın ve başka bir yol (ördek yazarak kesinlikle çalışmıyor) bulunmaktadır ya da ben gerçekten yazmalıyım her bir özellik üzerinde bu verim ile bir işlev - ve nasıl?

+0

Ne istediğinizi tam olarak açık değil. Sorunuzu gösteren kısa, eksiksiz, bağımsız bir program üretebilir misiniz? Daha fazla bilgi için bakınız [mcve]. –

cevap

0

lxml, gereksinimlerinize uygun özel öğe sınıfları sağlar.

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

Cevabınız için teşekkürler, kullanmaya çalışacağım –