Интерфейс запросов в 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()
Другие вопросы по тегам