1428
Конференция C SoobCha
письмо # 1429
|
1430 |
|
Здравствуйте, Лагоша.Вы писали 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 |
|
|
|
|