Модераторы: diadiavova
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MSXML3 на C++, Не могу заставить его работать 
:(
    Опции темы
halfmer
Дата 30.1.2007, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.10.2006

Репутация: нет
Всего: нет



Здравствуйте, винградовцы!
У меня такая проблема: нужно проверить, соответствует ли данный xml-документ заданной схеме. 
Пробовал такой код (Взято из PlatformSDK, с моими маленькими изменениями)
Код

#include <stdio.h>
#include <tchar.h>
#import <msxml3.dll>
using namespace MSXML2;

void dump_com_error(_com_error &e);

_bstr_t validateFile(_bstr_t strFile)
{

   // Declare and initialize variables
   IXMLDOMSchemaCollectionPtr   pXS;
   IXMLDOMDocument2Ptr          pXD = NULL;
   MSXML2::IXMLDOMParseErrorPtr pErr = NULL;
   _bstr_t strResult = "";
   HRESULT hr;

   // Create a schema cache and add books.xsd to it.
   hr = pXS.CreateInstance(__uuidof(XMLSchemaCache40));
   
   if (FAILED(hr) || pXS == NULL)
   {
      printf("Here1\n");
      return "";
   }
   hr = pXS->add("urn:books", "sc.xsd");
   

   // Create a DOMDocument and set its properties.
   hr = pXD.CreateInstance(__uuidof(DOMDocument40));
   if (FAILED(hr) || pXD == NULL)
   {
      printf("Here2\n");
      return "";
   }

   // Assign the schema cache to the DOMDocument's
   // schemas collection.
   pXD->schemas = pXS.GetInterfacePtr();
   
   if (FAILED(hr))
   {
      printf("Here3\n");
      return "";
   }

   // Load books.xml as the DOM document.
   pXD->async = VARIANT_FALSE;
   pXD->validateOnParse = VARIANT_TRUE;
   pXD->resolveExternals = VARIANT_TRUE;
   hr = pXD->load(strFile);
   
   pErr = pXD->parseError;

   // Return validation results in message to the user.
   if (pErr->errorCode != S_OK)
   {
      strResult = _bstr_t("Validation failed on ") + strFile +
         _bstr_t("\n=====================") +
         _bstr_t("\nReason: ") + _bstr_t(pErr->Getreason()) +
         _bstr_t("\nSource: ") + _bstr_t(pErr->GetsrcText()) +
         _bstr_t("\nLine: ") + _bstr_t(pErr->Getline()) +
         _bstr_t("\n");
   }
   else
      strResult = _bstr_t("Validation succeeded for ") + strFile +
         _bstr_t("\n======================\n") +
         _bstr_t(pXD->xml) + _bstr_t("\n");

   return strResult;

   // Clean up and destroy objects.
   if (pXS) pXS.Release();
   if (pXD) pXD.Release();
   if (pErr) pErr.Release();
}

void main()
{
   CoInitialize(NULL);
   try
   {
      _bstr_t sOutput = validateFile("sc-valid.xml");
      sOutput += validateFile("sc-notValid.xml");
      MessageBox(NULL,sOutput, "schemaCache",MB_OK);
   }
   catch(_com_error &e)
   {
      dump_com_error(e);
   }
}

void dump_com_error(_com_error &e)
{
   printf("Error\n");
   printf("Code = %08lx\n", e.Error());
   char mystr[700];
   CharToOem(e.ErrorMessage(), mystr);
   printf("Code meaning = %s\n", mystr);
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());
   printf("Source = %s\n", (LPCSTR) bstrSource);
   CharToOem(e.Description(), mystr);
   printf("Description = %s\n", (LPCSTR) mystr);
}


Так вот, проблема в том, что при установленном MSXML4 
(даже несмотря на #import <msxml3.dll>) все работает прекрасно, а без MSXML4, соответственно, не работает. Изменение 
hr = pXS.CreateInstance(__uuidof(XMLSchemaCache40)) на 
hr = pXS.CreateInstance(__uuidof(XMLSchemaCache)) не помогает

Помогите, плс. Если можно, объясните, как проделать такое и на MSXML2

И еще вопрос (может, он тупой, т.к. я в xml'e плохо шарю): во всех примерах по проверке соответствия документа схеме, которые [примеры] я видел, на момент написания кода известно значение targetNamespace схемы, которое используется в IXMLDOMSchemaCollectionPtr->add(). А что делать, если я не знаю этого значения? Как мне его вытащить из схемы (парсинг вручную не устраивает). И что нужно указывать первым параметром метода add, если в схеме не указано значение targetNamespace?

Это сообщение отредактировал(а) halfmer - 31.1.2007, 11:18
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

Прежде чем опубликовать вопрос, попробуйте воспользоваться поиском - возможно тема уже поднималась.

Также рекомендуем Вам зайти в раздел FAQ ,раздел дополняется и, возможно, там вы увидите готовое решение.

Для ответов на часто задаваемые вопросы существует FAQ раздела. Новости можно публиковать в разделе новостей. Для статей так же есть специальный раздел

Желаем удачи в Вашем деле!


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | XML, XSL | Следующая тема »


 




[ Время генерации скрипта: 0.0491 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.