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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с формированием XML 
:(
    Опции темы
Mephisto
Дата 26.2.2008, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


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

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



Есть следующее приложенице, по нему есть ряд вопросов:
Код

#ifndef _Serializer_h_
#define _Serializer_h_
#include "stdafx.h"
#import "msxml.dll" named_guids raw_interfaces_only

class XMLHelper {
public:
    XMLHelper(CComQIPtr<IXMLDOMElement>& DomNode):fXMLNode(DomNode){}
    bool WriteAttr(CString& AttrName, VARIANT AValue){
        return SUCCEEDED(fXMLNode->setAttribute(BSTR(AttrName.GetBuffer()), AValue));
    }
    bool WriteText(CString& AttrName){
        return SUCCEEDED(fXMLNode->put_text(BSTR(AttrName.GetBuffer())));
    }
private:
    CComQIPtr<IXMLDOMElement>& fXMLNode;
};

class CustomInfo {
public:
    virtual bool WriteInfo(XMLHelper& AHelper) = 0;
};

class TestSystem : public CustomInfo {
public:
    bool WriteInfo(XMLHelper& AHelper){
        bool res;
        res = AHelper.WriteAttr(CString("test"), CComVariant(123));
        if (!res) return false;
        res = AHelper.WriteText(CString("tratata"));
        return res;
    }
};

class Serializer {
public:
    Serializer(){
        CoInitialize(NULL);
        CoCreateInstance(MSXML::CLSID_DOMDocument, NULL, 
                 CLSCTX_INPROC_SERVER,
                 MSXML::IID_IXMLDOMDocument, 
                 (void**)&fDomDocument);
    }
    ~Serializer(){fDomDocument->Release();}
    bool SaveToFile(CString& FileName, CustomInfo& AInfo){
        IXMLDOMNode* LLLL;
        IXMLDOMNode* LChild;
        HRESULT hr1 = fDomDocument->createNode(CComVariant(NODE_ELEMENT),
                      CComBSTR("TestSystem"),
                      NULL,
                      &LLLL);

        HRESULT hr2 = fDomDocument->appendChild(LLLL, &LChild);
        LLLL->Release();
        if FAILED(hr2) return false;
        CComQIPtr<IXMLDOMElement> LNode = LChild;
        XMLHelper h(LNode);
        bool b = AInfo.WriteInfo(h);

        fDomDocument->save(CComVariant("c:\\3.xml"));
        return true;
    }
private:
    IXMLDOMDocument* fDomDocument;
};


#endif //_Serializer_h_

Метод который вызывает данный код:
Код

        TestSystem s;
    Serializer ser;
    ser.SaveToFile(CString("c:\\3.xml"), s);

Собственно вопрос 1:
Если в настройках проекта указать Character Set : Use Milti-byte character set. То атрибут не сохраняется. Т.е. bool b = AInfo.WriteInfo(h); - false. А если указать Character Set : Use Unicode character set, то все работает нормально. Как сделать так чтоб работало именно при "Use Milti-byte character set", потому как все остальное приложение работает только так, это только упрощенная выборка. 
И вопрос 2:
Мош кто надет какие-нить грибы... Буду рад если кто укажет на упрощенные варианты кода. На сях не так много опыта работы.  smile

Добавлено через 9 минут и 45 секунд
Немного предыстории...
Есть некоторое дерево объектов, каждый элемент которого потомок некого CustomInfo. Объект Serializer сделан для того чтоб сохранить дерево в формате XML(SaveToFile(CString& FileName, CustomInfo& AInfo)). Для этого передается путь до файла и Root дерева. Для сохранения он обходит дерево и с каждым элементом елает следующее:
1) Создает саму XML ноду с типом соответствующей ноды
2) Создает "обьект помощник" и передает его в виртуальный метод CustomInfo. Объект помощник имеет несколько методов, таких как добавить атрибут у XML ноды и Title. Каждый элемент дерева соответственно глумится над XML нодой как ему нужно.

В данном примере создается только тестовый TestSystem, у него перекрытый WriteInfo. Дерево не создается, по сему обходчиков никаких нет, для упрощения примера.
PM   Вверх
Mephisto
Дата 26.2.2008, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


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

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



В принципе помогла замена всех CString на CStringW.

Добавлено через 28 секунд
Но все-равно принимается здравая критика smile
PM   Вверх
Alek86
Дата 26.2.2008, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ну, на всякий случай, работая со строками неизвесной кодировки лучше всегда использовать макрос _T(/*строка*/)

а вообще, навряд ли кто-то будет там лазить тебе ошибки выискивать. тем более, что ветка форума не по ATL


--------------------
user posted image    user posted image
PM MAIL   Вверх
Mephisto
Дата 26.2.2008, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


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

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



Alek86, СПС. Не юзал этот макрос, посмотрю. А темку действительно лучше перетащить.

Да, и еще один момент забавный... Если написать так:
Код

#ifndef _Serializer_h_
#define _Serializer_h_
#include "stdafx.h"
#import "msxml.dll" named_guids raw_interfaces_only

class XMLHelper {
public:
    XMLHelper(CComQIPtr<IXMLDOMElement>& DomNode):fXMLNode(DomNode){}
    bool WriteAttr(CStringW& AttrName, VARIANT AValue){
        return SUCCEEDED(fXMLNode->setAttribute(BSTR(AttrName.GetBuffer()), AValue));
    }
    bool WriteText(CStringW& AttrName){
        return SUCCEEDED(fXMLNode->put_text(BSTR(AttrName.GetBuffer())));
    }
private:
    CComQIPtr<IXMLDOMElement>& fXMLNode;
};

class CustomInfo {
public:
    virtual bool WriteInfo(XMLHelper& AHelper) = 0;
};

class TestSystem : public CustomInfo {
public:
    bool WriteInfo(XMLHelper& AHelper){
        bool res;
        res = AHelper.WriteAttr(CStringW("test"), CComVariant(123));
        if (!res) return false;
        res = AHelper.WriteText(CStringW("тратаа"));
        return res;
    }
};

class Serializer {
public:
    Serializer(){
        CoInitialize(NULL);
        CoCreateInstance(MSXML::CLSID_DOMDocument, NULL, 
                 CLSCTX_INPROC_SERVER,
                 MSXML::IID_IXMLDOMDocument, 
                 (void**)&fDomDocument);
    }
    ~Serializer(){fDomDocument->Release();}
    bool SaveToFile(CString& FileName, CustomInfo& AInfo){
        IXMLDOMNode* LLLL;
        IXMLDOMNode* LChild;
        HRESULT hr1 = fDomDocument->createNode(CComVariant(NODE_ELEMENT),
                      CComBSTR("TestSystem"),
                      NULL,
                      &LLLL);

        HRESULT hr2 = fDomDocument->appendChild(LLLL, &LChild);
        LLLL->Release();
        if FAILED(hr2) return false;
        CComQIPtr<IXMLDOMElement> LNode = LChild;
        XMLHelper h(LNode);
        bool b = AInfo.WriteInfo(h);

        BSTR text;
        fDomDocument->get_xml(&text);
        fDomDocument->save(CComVariant("c:\\3.xml"));
        return true;
    }
private:
    IXMLDOMDocument* fDomDocument;
};


#endif //_Serializer_h_


то fDomDocument->get_xml(&text) возвращает следующее: 
Цитата

<TestSystem test="123">тратаа</TestSystem>

а после сохраненное выглядит так:
Цитата

<TestSystem test="123">╤В╤А╨░╤В╨░╨░</TestSystem>

Второй вариант логичнее. Но почему просто get_xml выдает лажу smile 

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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