Интерфейс запросов в COM-сервере Python
Я в настоящее время начинаю с пакета win32com. У меня есть XSL-файл, где я использую COM-объект, запрограммированный на Python:
<xsl:value-of select="plugin:GetTest(.)"/>
XSL-преобразование выполняется с использованием MSXML2 XSL-процессора, а COM-объект Python внедряется с помощью метода 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'
Может кто-нибудь есть предложение, что я делаю не так? Заранее спасибо.
1 ответ
У меня были две ошибки в коде, во-первых, объект не является выбранным узлом, но выбор DOM (спасибо Мартин Хоннен), во-вторых, 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()