2017-03-16 2 views
0

Je commence actuellement avec le paquet win32com. Je fichier XSL où j'utilise un objet COM programmé dans le python:Interface de requête dans le serveur COM python

<xsl:value-of select="plugin:GetTest(.)"/> 

transformation XSL est effectuée en utilisant le processeur XSL et MSXML2 objet COM python est injecté en utilisant la méthode addObject. La mise en œuvre de la méthode GetTest est la suivante:

def GetTest(self, obj): 
     IID_IXMLDOMNode = IID("{2933BF80-7B36-11d2-B20E-00C04F983E60}") 
     try: 
      node = win32com.client.Dispatch(obj, None, IID_IXMLDOMNode) 
      #node = obj.QueryInterface(IID_IXMLDOMNode) 
      return node.get_text() 
     except Exception as e: 
      return format_exc() 

L'argument obj est de type PyIDispatch. Afin de travailler avec mon interface de noeud IXMLDOMNode je dois l'obtenir en quelque sorte, non? Cependant, l'approche décommentée échoue avec

AttributeError: <unknown>.get_text 

Et l'approche commenté échoue avec

obj.QueryInterface(IID_IXMLDOMNode)<\u000d>pywintypes.com_error: (-2147467262, 'No such interface supported' 

Quelqu'un peut-il a suggéré ce que je fais mal? Merci d'avance.

+2

Je ne l'ai jamais utilisé MSXML avec Python, donc je ne peux pas évaluer la partie Python du code, mais autant que je me souvienne de JScript ou VBScript lorsque vous utilisez par exemple 'foo: method (.)' du côté XSLT vous ne passez pas un seul noeud à la méthode mais plutôt une sélection https://msdn.microsoft.com/fr-fr/library/ms759171(v=vs.85) .aspx, vous pouvez donc essayer de savoir si votre code Python peut être adapté pour lancer une sélection et non un nœud. –

+0

Merci. Vous avez raison, le _obj_ est la sélection DOM –

Répondre

0

J'ai eu deux erreurs dans le code, d'une part, la obj n'est pas sélectionné noeud mais la sélection DOM (merci Martin Honnen), d'autre part, IXMLDOMNode n'a pas _get_text_ méthode

def GetTest(self, obj): 
    try: 
     selector = win32com.client.Dispatch(obj, None, IID_IXMLDOMSelection) 

     out = [] 

     for node in selector: 
      out.append(node.nodeName) 

     return ", ".join(out) 
    except Exception as e: 
     return format_exc()