Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > интерфейс IMXNamespaceManager


Автор: nuzzle 14.4.2009, 14:29
Здравствуйте!

Передо мной стоит задача обработать содержимое тегов, добавленных в документ Word 2003, сохраненный в формате xml. Имена тегов имеют префикс "ns0:" пространства имен присоединенной мною схемы. Изучив примеры кода для платформы .NET, я нашел, что пространства имен добавляются с помощью объекта XmlNamespaceManager. А как действовать при использовании XML DOM? Поискав в MSDN, я нашел интерфейс http://msdn.microsoft.com/en-us/library/ms766571(VS.85).aspx, который, судя по описанию, выполняет те же функции, что и XmlNamespaceManager, но его использование в C++ и связь с интерфейсом документа мне пока не ясна. 

Объясните, пожалуйста, как добавить пространства имен для экземпляра XMLDocument40.

Автор: nuzzle 16.4.2009, 02:45
Оказалось, я двигался в неверном направлении. Чтобы задать пространства имен для экземпляра документа XML, нужно воспользоваться расширенным интерфейсом http://msdn.microsoft.com/en-us/library/ms761358(VS.85).aspx. С его помощью можно задать свойство второго уровня http://msdn.microsoft.com/en-us/library/ms756048.aspx, которое и является определением пространств имен для документа. Свойство задается методом setProperty:
Код

HRESULT setProperty (BSTR name, VARIANT value);
 
Например,
Код


    ... 

    ::CoInitialize(NULL);

    HRESULT hr;
    // смарт-указатели на интерфейсы DOM
    MSXML2::IXMLDOMDocument2Ptr pXMLWordDoc;
    MSXML2::IXMLDOMNodePtr pXMLNode;

    _variant_t customNamespace(_T("xmlns:ns0='http://serviceorder-schema.com' \
                            xmlns:w='http://schemas.microsoft.com/office/word/2003/wordml'"));
    try
    {
        hr = pXMLWordDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
        if (FAILED(hr)) throw hr;

        pXMLWordDoc->load(_T("D:\\MyTemplate.xml"));

        pXMLWordDoc->setProperty(_T("SelectionNamespaces"), customNamespace);

        /* теперь можно искать в документе теги
        с префиксами заданных пространств имен,
        например, пользовательского xmlns:ns0 */
        pXMLNode = pXMLWordDoc->selectSingleNode(_T("//ns0:ClientAddress"));

        // вывод содержимого тега
        printf((LPCSTR)pTable->xml);
    }
    catch (...)
    {
         printf("Error!");
    }

    pXMLWordDoc.Release();
    pXMLNode.Release();

    ::CoUninitialize();

    ...




Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)