Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с XML, изменение и сохранение открытого файла 
V
    Опции темы
Aline
Дата 6.2.2009, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем привет!

Есть файл xml, я его загружаю и раскидыываю ноды в диалоге. Затем пользователь может что то изменить и мне эти изменения необходимо сохранить в этот же файл. Делаю следующее:

Код

        HRESULT hr;
        IXMLDOMDocument * pXMLDoc;
        IXMLDOMNode * pXDN;
        VARIANT   v;
        VARIANT_BOOL  res;
        IXMLDOMNodeList *dlist1, *dlist2;
        IXMLDOMNamedNodeMap *atrMap;
        BSTR bstr1;
        CString   s;
        bool flIsFileOpen = false;
        long value;

        CString *eCam[3];
        eCam[0] = &m_TextCam1;
        eCam[1] = &m_TextCam2;
        eCam[2] = &m_TextCam3;

            
        hr = CoInitialize(NULL); 
        hr = CoCreateInstance(CLSID_DOMDocument30, NULL, CLSCTX_INPROC_SERVER, 
               IID_IXMLDOMDocument, (void**)&pXMLDoc);
        
        bstr1 = SysAllocString(filename);
        v.vt = VT_BSTR;
        v.bstrVal = bstr1;
        hr = pXMLDoc->load(v, &res);

        bstr1 = SysAllocString(L"Input");
        hr |= pXMLDoc->getElementsByTagName(bstr1, &dlist1); 
        hr |= dlist1->get_length(&value);
        
        m_CountFolders = value;
            
        CPilotFrameCutterDlg dlg;
        
        [color=blue]for (int i = 0; i < m_CountFolders; i++) {
            hr |= dlist1->get_item(i, &pXDN);
            pXDN->put_text((BSTR)eCam[i]);
        
            hr |= pXDN->get_attributes(&atrMap);
            pXDN->Release();
            hr |= atrMap->get_item(0, &pXDN);
            hr |= pXDN->get_text(&bstr1);
            pXDN->Release();
            atrMap->Release();
        }

        eOpnXml.GetWindowTextW(s);
        bstr1 = SysAllocString(s);
        v.vt = VT_BSTR;
        v.bstrVal = bstr1;
        pXMLDoc->save(v);[/color]


Проблема: всё сохраняется, но при открытии xml-файла в редакторе, вижу что в ноды записана какая то абракадабра. Т.е. у меня там записаны пути к папкам причем латинскими буквами, а открываю - там какие то символы непонятные. И потом когда пытаюсь этот файл открыть в программе, ругается и говорит что некоректный файл и считает что записей в нем нет. Что делать?
PM MAIL   Вверх
Aline
Дата 6.2.2009, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Решила создавать новый xml, но почему то он не сохраняется. Вернее сохраняется только первая строка
<?xml version="1.0"?>

Делаю так :
Код

bool CEditXml::SaveXml(CString filename)
{
    IXMLDOMDocument *pXMLDom = NULL;
    IXMLDOMProcessingInstruction *pi = NULL;
    IXMLDOMComment *pc = NULL;
    IXMLDOMElement *pe = NULL;
    IXMLDOMElement *pRoot = NULL;
    IXMLDOMAttribute *pa = NULL;
    IXMLDOMAttribute *pa1 = NULL;
    IXMLDOMCDATASection *pcd = NULL;
    IXMLDOMElement *peSub = NULL;
    IXMLDOMDocumentFragment *pdf=NULL;

    BSTR bstr = NULL;
    BSTR bstr1 = NULL;
    BSTR bstr_wsn = SysAllocString(L"\n");
    BSTR bstr_wsnt = SysAllocString(L"\n\t");
    BSTR bstr_wsntt = SysAllocString(L"\n\t\t");

    VARIANT var;
    HRESULT hr;

    CString s = L"";

    CEdit *eCam[3];
    eCam[0] = &eCam1;
    eCam[1] = &eCam2;
    eCam[2] = &eCam3;

    CoInitialize(NULL);
    VariantInit(&var);

    hr = CoCreateInstance(CLSID_DOMDocument30, NULL, CLSCTX_INPROC_SERVER, 
               IID_IXMLDOMDocument, (void**)&pXMLDom);

    bstr = SysAllocString(L"xml");
    bstr1 = SysAllocString(L"version='1.0'");
    pXMLDom->createProcessingInstruction(bstr,bstr1,&pi);

    IXMLDOMNode *pNode = NULL;

    pXMLDom->appendChild(pi,&pNode);
    pi->Release();
    pi = NULL;
    SysFreeString(bstr);
    bstr = NULL;
    SysFreeString(bstr1);
    bstr1 = NULL;
    
    bstr = SysAllocString(L"Chapter");
    pXMLDom->createElement(bstr,&pRoot);
    SysFreeString(bstr);
    bstr = NULL;

    AddWhiteSpaceToNode(pXMLDom,bstr_wsnt,pRoot);
    bstr = SysAllocString(L"Folders");
    pXMLDom->createElement(bstr,&pe);
    SysFreeString(bstr);
    bstr = NULL;

    pXMLDom->createDocumentFragment(&pdf);
    
    AddWhiteSpaceToNode(pXMLDom,bstr_wsntt,pdf);

    for (int i = 0; i < m_CountFolders; i++) {
        bstr = SysAllocString(L"Input");
        pXMLDom->createElement(bstr,&peSub);
        SysFreeString(bstr);
        bstr = NULL;

        AppendChildToParent(peSub,pdf);

        eCam[i]->GetWindowText(s);
        bstr = SysAllocString(s.GetBuffer());
        peSub->put_text(bstr);
        SysFreeString(bstr);
        bstr = NULL;

        peSub->Release();
        peSub = NULL;
    }

    VariantClear(&var);
    bstr = SysAllocString(filename);
    var.vt = VT_BSTR;
    var.bstrVal = bstr;    
    pXMLDom->save(var);
    SysFreeString(bstr);
    bstr = NULL;
---------


где ошибка?

PM MAIL   Вверх
Rififi
Дата 6.2.2009, 19:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Все эти Variant*, SysAlloc* только захламляют код. С помщью директивы #import cделай обёртки над интерфейсами IXMLDOM* и юзай _bstr_t, _variant_t и пр.
PM MAIL   Вверх
Aline
Дата 9.2.2009, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


 




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


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

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