2017-03-16 33 views
0

我目前从win32com软件包开始。我有哪里我使用的Python编程COM对象XSL文件:python COM服务器查询界面

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

XSL转换使用MSXML2 XSL处理器和Python COM对象所做的是使用ADDOBJECT方法注入。 的GetTest方法的实施如下:

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() 

OBJ参数具有键入PyIDispatch。为了与我的IXMLDOMNode节点接口一起工作,我必须以某种方式获得它,对吧?然而,没有注释的方法失败,

AttributeError: <unknown>.get_text 

而且评价方法未能与

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

有谁能够有什么样的建议我做错了什么?提前致谢。

+2

我从来没有使用MSXML与Python,所以我不能评估代码的Python部分,但据我记得,当你使用例如从JScript或VBScript 'foo:method(。)'在XSLT端,您不会将单个节点传递给方法,而是选择https://msdn.microsoft.com/zh-cn/library/ms759171(v=vs.85 ).aspx,所以你可能想试试你的Python代码是否可以转换为选择而不是节点。 –

+0

谢谢。你是对的,_obj_是DOM选择 –

回答

0

我曾在两个代码错误,首先,没有选择OBJ节点,但DOM选择(感谢马丁Honnen),其次,IXMLDOMNode还没有_get_text_方法

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()