Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MSXml 
:(
    Опции темы
knut
Дата 13.6.2007, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



есть xml 
Цитата

<?xml version="1.0" encoding="utf-16" ?>
<MessageAccount>
    <Account_Name type="SZ">192.168.0.1</Account_Name>
    <Connection_Type type="DWORD">00000000</Connection_Type>
    <POP3_Server type="SZ">192.168.0.1</POP3_Server>
    <POP3_User_Name type="SZ">asergey</POP3_User_Name>
    <POP3_Password2 type="BINARY">01000000d08c9ddf0115d1118c7a00c04fc297eb010000006a14f1068c5be849b66d5dec30cc66fe0000000002000000000003660000a8000000100000001e08ddd0cb1c0387f0f0d2913731d0990000000004800000a000000010000000380d4f5bb61d672bf61477f794d9b40920000000873511812c1976442b27e46297caca3bc1add3ddab113deef57409faf0164b2914000000682e29b7f7f01bdf283185a7d8361ad684947e9f</POP3_Password2>
    <POP3_Use_Sicily type="DWORD">00000000</POP3_Use_Sicily>
    <POP3_Prompt_for_Password type="DWORD">00000000</POP3_Prompt_for_Password>
    <SMTP_Server type="SZ">192.168.0.1</SMTP_Server>
    <SMTP_Display_Name type="SZ">asergey</SMTP_Display_Name>
</MessageAccount>


как веснилось этот xml tinyxml парсер не спарсит.
как его спарсить MSXml om 




--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
Daevaorn
Дата 13.6.2007, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(knut @  13.6.2007,  14:46 Найти цитируемый пост)

как веснилось этот xml tinyxml парсер не спарсит.

почему?
PM MAIL WWW   Вверх
korbian
Дата 13.6.2007, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Смотри следующие интерфейсы:
IXMLDOMDocument, IXMLDOMNodeList, IXMLDOMNode и т.д.
В MSDN очень подробно описано.


Цитата(Daevaorn @  13.6.2007,  15:34 Найти цитируемый пост)
почему?

Насколько я помню, utf-16 онный не поддерживает.  smile  могу ошибаться



--------------------
korbian ©
PM   Вверх
knut
Дата 13.6.2007, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Daevaorn, 
encoding="utf-16 не подержывает


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
jonie
Дата 13.6.2007, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



можно сделать по тупому )) сконвертить в UTF8 в памяти и скормить tinyXML ))
а если MSXML то....
Код

#import "msxml6.dll"
#include <msxml2.h>
using namespace MSXML2;
......
inline void EVAL_HR( HRESULT _hr ) { if FAILED(_hr) throw(_hr); }
.......
IXMLDOMDocument2Ptr pXMLDoc;
pXMLDoc.CreateInstance("Msxml2.DOMDocument.4.0")
//load the document synchronously
pXMLDoc->async = false;
_variant_t varLoadResult((bool)FALSE);
//    Load the XML document
varLoadResult = pXMLDoc->load(xmldoc);
if(!varLoadResult){
   throw "Error Loading?";
} 

//get root
IXMLDOMElementPtr pRootElem = NULL;
EVAL_HR(pXMLDoc->get_documentElement(&pRootElem));

// Get sub - root element 
pSubRootElem = pRootElem->selectSingleNode("someothersection");
if(!pSubRootElem){
  throw "sub section not present";
}
....


и так далее в том же духе....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
knut
Дата 13.6.2007, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



загрузил xml 
Код

CoInitialize(NULL);
CComPtr<IXMLDOMDocument> spXMLDOM;
HRESULT hr = spXMLDOM.CoCreateInstance(__uuidof(DOMDocument));
    VARIANT_BOOL bSuccess = false;
hr = spXMLDOM->load(CComVariant(L"xmldata.xml"),&bSuccess);



a как получить значение тегов(всеx) т.е(192.168.0.1 ...) не как не получается 


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
knut
Дата 13.6.2007, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



еще вопрос мне что для каждого элемента надо писать такое или можно как то loop организовать?(а вот как?)
и еще вопрос а этот код в VS 6 версии будет работать?
Код

CComBSTR bstrSS(L"MessageAccount/Account_Name");
CComPtr<IXMLDOMNode> spXMLNode;
spXMLDOM->selectSingleNode(bstrSS,&spXMLNode);



а вот этот код только для онного нода как цыкл организовать? 
Код

IXMLDOMDocumentPtr docPtr;
IXMLDOMElementPtr ElementPtr;
CoInitialize(NULL);
CComPtr<IXMLDOMDocument> spXMLDOM;
HRESULT hr = spXMLDOM.CoCreateInstance(__uuidof(DOMDocument));
        // Load the XML document file...
        VARIANT_BOOL bSuccess = false;
hr = spXMLDOM->load(CComVariant(L"xmldata.xml"),&bSuccess);

    IXMLDOMElementPtr pRootElem = NULL;
    spXMLDOM->get_documentElement(&pRootElem);


    CComBSTR bstrSS(L"MessageAccount/Account_Name");
    CComPtr<IXMLDOMNode> spXMLNode;

    spXMLDOM->selectSingleNode(bstrSS,&spXMLNode);

    CComVariant varValue(VT_EMPTY);
    hr = spXMLNode->get_nodeTypedValue(&varValue);
    USES_CONVERSION;
    LPTSTR lpstrMsg = W2T(varValue.bstrVal);
    std::cout << lpstrMsg << std::endl;


CoUninitialize();





--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
korbian
Дата 14.6.2007, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

IXMLDOMElement::getElementsByTagName()    // получение коллекции node по имени
// можно указать вместо имени "*", что означает вернуть все node 
IXMLDOMNodeList::nextNode() //для прохода по Node коллекции

Для работы с каждым Node смотри описание IXMLDOMNode, у него много полезных методов.

Это сообщение отредактировал(а) korbian - 14.6.2007, 07:46


--------------------
korbian ©
PM   Вверх
knut
Дата 14.6.2007, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



korbian, 
я зделал так
но у меня прога летит
Код

CoInitialize(NULL);
CComPtr<IXMLDOMDocument> spXMLDOM;
HRESULT hr = spXMLDOM.CoCreateInstance(__uuidof(DOMDocument));
        // Load the XML document file...
        VARIANT_BOOL bSuccess = false;
hr = spXMLDOM->load(CComVariant(L"xmldata.xml"),&bSuccess);

    IXMLDOMElementPtr pRootElem = NULL;
    spXMLDOM->get_documentElement(&pRootElem);
    //IXMLDOMElement::getElementsByTagName()  
    
    std::vector<CComBSTR>m_vector;

    CComBSTR bstrSS_1(L"MessageAccount/Account_Name");
    m_vector.push_back(bstrSS_1);
    CComBSTR bstrSS_2(L"MessageAccount/Connection_Type");
    m_vector.push_back(bstrSS_2);
    CComBSTR bstrSS_3(L"MessageAccount/POP3_Server");
    m_vector.push_back(bstrSS_3);
    CComBSTR bstrSS_4(L"MessageAccount/POP3_User_Name");
    m_vector.push_back(bstrSS_4);
    CComBSTR bstrSS_5(L"MessageAccount/POP3_Password2");
    m_vector.push_back(bstrSS_5);
    CComBSTR bstrSS_6(L"MessageAccount/POP3_Use_Sicily");
    m_vector.push_back(bstrSS_6);
    CComBSTR bstrSS_7(L"MessageAccount/POP3_Prompt_for_Password");
    m_vector.push_back(bstrSS_7);
    CComBSTR bstrSS_8(L"MessageAccount/SMTP_Server");
    m_vector.push_back(bstrSS_8);
    CComBSTR bstrSS_9(L"MessageAccount/SMTP_Display_Name");
    m_vector.push_back(bstrSS_9);
    CComBSTR bstrSS_10(L"MessageAccount/SMTP_Email_Address");
    m_vector.push_back(bstrSS_10);

    CComPtr<IXMLDOMNode> spXMLNode;
    
    std::vector<CComBSTR>::iterator it_begin = m_vector.begin();
    for(it_begin;it_begin!=m_vector.end();++it_begin)
    {
                spXMLDOM->selectSingleNode(*it_begin,&spXMLNode);

                
                CComVariant varValue(VT_EMPTY);
                hr = spXMLNode->get_nodeTypedValue(&varValue);

                            
                USES_CONVERSION;
                LPTSTR lpstrMsg = W2T(varValue.bstrVal);
                std::cout << lpstrMsg << std::endl;
                
    }
    
    

CoUninitialize();


не ну чувсвую решение тупое но по иному не как не получается


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
korbian
Дата 14.6.2007, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Попробуй так:
Код

::CoInitialize(0);
  CComPtr<IXMLDOMDocument> XMLDoc;
  HRESULT hr = ::CoCreateInstance( CLSID_DOMDocument, NULL, 
    CLSCTX_INPROC_SERVER,
    IID_IXMLDOMDocument, (void**)&XMLDoc);
  if( FAILED(hr) )
  {
    ::CoUninitialize();
    return -1;
  }
  VARIANT_BOOL Success = false;
  hr = XMLDoc->load( CComVariant(L"knut.xml"), &Success );
  if( FAILED(hr) )
  {
    ::CoUninitialize();
    return -1;
  } 
  CComPtr<IXMLDOMElement> elem;
  hr = XMLDoc->get_documentElement(&elem);
  if( FAILED(hr) )
  {
    ::CoUninitialize();
    return -1;
  }
  CComPtr<IXMLDOMNodeList> nodeList;
  hr = elem->getElementsByTagName(CComBSTR(L"*"), &nodeList);
  if( FAILED(hr) )
  {
    ::CoUninitialize();
    return -1;
  }
  while(true)
  {
    CComPtr<IXMLDOMNode> node;
    hr = nodeList->nextNode(&node);
    if( FAILED(hr) )
    {
      ::CoUninitialize();
      return -1;
    }
    else
    {
      if(node == 0)
      {
        break;
      }
      else
      {
        CComBSTR name;
        node->get_text(&name);
        USES_CONVERSION;
        std::cout<<W2T(name.m_str)<<std::endl;
      }
    }
  }
  ::CoUninitialize();



--------------------
korbian ©
PM   Вверх
knut
Дата 14.6.2007, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



korbian, 
После ::CoUninitialize(); почему то летит но почему?


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
korbian
Дата 14.6.2007, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Потому что вызов ::CoUninitialize() предшествует вызову Release() в деструкторе объектов CComPtr<>
в отладчике прошелся только до ::CoUninitialize(), потому и не заметил .
Исправленный вариант (носит демонстрационный характер):
Код

  ::CoInitialize(0);
  for(;;)
  {
    CComPtr<IXMLDOMDocument> XMLDoc;
    HRESULT hr = ::CoCreateInstance( CLSID_DOMDocument, NULL, 
      CLSCTX_INPROC_SERVER,
      IID_IXMLDOMDocument, (void**)&XMLDoc);
    if( FAILED(hr) )
    {
      break;
    }
    VARIANT_BOOL Success = false;
    hr = XMLDoc->load( CComVariant(L"knut.xml"), &Success );
    if( FAILED(hr) )
    {
      break;
    } 
    CComPtr<IXMLDOMElement> elem;
    hr = XMLDoc->get_documentElement(&elem);
    if( FAILED(hr) )
    {
      break;
    }
    CComPtr<IXMLDOMNodeList> nodeList;
    hr = elem->getElementsByTagName(CComBSTR(L"*"), &nodeList);
    if( FAILED(hr) )
    {
      break;
    }
    while(true)
    {
      CComPtr<IXMLDOMNode> node;
      hr = nodeList->nextNode(&node);
      if( FAILED(hr) )
      {
        break;
      }
      else
      {
        if(node == 0)
        {
          break;
        }
        else
        {
          CComBSTR name;
          node->get_text(&name);
          USES_CONVERSION;
          //CComVariant var = name;
          std::cout<<W2T(name.m_str)<<std::endl;
        }
      }
    }
    break;
  }
  ::CoUninitialize();
    return 0;

Совет: напиши обертку над этим делом. 

Это сообщение отредактировал(а) korbian - 14.6.2007, 13:00


--------------------
korbian ©
PM   Вверх
knut
Дата 14.6.2007, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



korbian, 
а этот код под VS 6 откомпелируется?


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
korbian
Дата 15.6.2007, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



knut, должен. Будут проблемы пиши.


--------------------
korbian ©
PM   Вверх
lemax
Дата 30.7.2008, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(knut @ 14.6.2007,  09:12)
korbian, 
я зделал так
но у меня прога летит
Код

CoInitialize(NULL);
CComPtr<IXMLDOMDocument> spXMLDOM;
...
CoUninitialize();


не ну чувсвую решение тупое но по иному не как не получается



Попробуйте так писать
Код


{
      if(CoInitialize(NULL)==все в порядке)
      {
            {
                   CComPtr<IXMLDOMDocument> spXMLDOM;
                   ...
            }//Здесь диструктор CComPtr<IXMLDOMDocument> со своей spXMLDOM->Release() будет вызван до CoUninitialize(), а не как у вас после пекращеня работы всего COM.
            CoUninitialize();
       }
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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