1428       Конференция C SoobCha           письмо # 1429 1430  


Тема: Re: Работа с файлами XML !!!
Дата: Wed, 21 Nov 2007 23:44:29 +0600
Кому: "C" <C@soobcha.org>
X-Mailer: The Bat! (v3.99.3) Professional
Content-Type: text/plain; charset=koi8-r
От Кого: "Alexey N. Vinogradov" <a_n_vinogradov@mail.ru>

     Здравствуйте, Лагоша.

Вы писали 20.11.2007, в 16:18 в письме <mid:list-847426@nvptus.ru>
  из почтовой программы: The Bat! (v3.60.07) Professional

ЛВГ> Привет Коллеги !!!
ЛВГ> Вопрос нежданно появился :
ЛВГ> Уже может и задавал, но забыл.

ЛВГ> Мне нужно вытягивать из файлов *.xml информацию. Как это делать - без понятия.

А проект это будет коммерческий, или открытый? Если открытый - скачай
исходники пирингового клиента StrongDC++. Там изящный класс
парсера/сериализатора SimlpeXML - всё из разряда "дёшево и эффективно". А
насчёт движка msxml - можно, конечно, и его использовать, но IMHO в
Strong всё намного проще и изящнее.

Вот пример кода загрузки и сохранения структуры в XML-файле (думаю,
всё понятно даже без комментариев - StepIn, StepOut, FindChild,
GetChildAttribute и пр.)

void SegmentManager::load()
{
        try {
                SimpleXML xml;
                xml.fromXML(File(getConfigFile(), File::READ, File::OPEN).read());

                if(xml.findChild("Segments")) {
                        xml.stepIn();
                        load(xml);
                        xml.stepOut();
                }
        } catch(const Exception& e) {
                dcdebug("SegmentManager::load: %s\n", e.getError().c_str());
        }
        init();
}

void SegmentManager::load(SimpleXML& aXml)
{
        dontSave = true;

        aXml.resetCurrentChild();
        if(aXml.findChild("States")) {
                aXml.stepIn();
                while(aXml.findChild("Seg")) {
                        string nm = aXml.getChildAttrib("Name");
                        segment* ns = 0;
                        if (m_segments.find(nm) != m_segments.end())
                                ns = m_segments[nm];
                        else
                                ns = new segment(nm);
                        ns->setIs_enabled(aXml.getBoolChildAttrib("State"));
                        m_segments[nm] = ns;
                }
                aXml.stepOut();
        }
        aXml.resetCurrentChild();
        if(aXml.findChild("Urls")) {
                aXml.stepIn();
                while(aXml.findChild("Mask")) {
                        DWORD msk = Util::toInt(aXml.getChildAttrib("value"));
                        aXml.stepIn();
                        while(aXml.findChild("BaseIP")) {
                                DWORD bsip = Util::toInt(aXml.getChildAttrib("value"));
                                const string& seg = aXml.getChildAttrib("name");
                                segments::const_iterator i = m_segments.find(seg);
                                if (i != m_segments.end())
                                        (*m_filtering)[msk][bsip] = i->second;
                                
                        }
                        aXml.stepOut();
                }
                aXml.stepOut();
        }

        dontSave = false;
}
void SegmentManager::save()
{
        if(dontSave)
                return;
                
        Lock l(cs);
        try {
                SimpleXML xml;

                xml.addTag("Segments");
                xml.stepIn();

                xml.addTag("States");
                xml.stepIn();

                for(segments::iterator i = m_segments.begin(); i!= m_segments.end(); ++i) {
                        xml.addTag("Seg");
                        xml.addChildAttrib("Name", i->first);
                        xml.addChildAttrib("State",i->second->getIs_enabled());
                }
                xml.stepOut();
                
                xml.addTag("Urls");
                xml.stepIn();
                for(ipmap::iterator i = m_filtering->begin(); i != m_filtering->end(); ++i) {
                        xml.addTag("Mask");
                        xml.addChildAttrib("value", i->first);
                        xml.stepIn();
                        for(baseipmap::iterator k = i->second.begin(); k != i->second.end(); ++k) {
                                xml.addTag("BaseIP");
                                xml.addChildAttrib("value", k->first);
                                xml.addChildAttrib("name", k->second->getName());
                        }
                        xml.stepOut();
                }
                xml.stepOut();
                xml.stepOut();

                string fname = getConfigFile();

                File f(fname + ".tmp", File::WRITE, File::CREATE | File::TRUNCATE);
                f.write(SimpleXML::utf8Header);
                f.write(xml.toXML());
                f.close();
                File::deleteFile(fname);
                File::renameFile(fname + ".tmp", fname);

        } catch(const Exception& e) {
                dcdebug("FavoriteManager::save: %s\n", e.getError().c_str());
        }
}


--
С уважением, Alexey N. Vinogradov (mailto:klirik@narod.ru) http://klirik.narod.ru



  1428 1430  
 
???Mail.ru ??? ?????
╘ 2000-2006 Сообщество Чайников