Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
21 / 13 / 5
Регистрация: 04.11.2012
Сообщений: 89
Записей в блоге: 1

Редактирование XML файла

10.03.2013, 22:05. Показов 3219. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, столкнулся с проблемой "фильтрации" xml файла.
Задача по сути легкая, но есть одно НО : файл, в котором проводится фильтрация просто огромный ~ 600mb, т.е построчно обрабатывать его займет много времени.

Вот такое содержимое файла на входе:
XML
1
2
3
4
5
6
<node id="31447942" version="9" timestamp="2012-03-29T22:49:21Z" uid="336354" user="esaulenka" changeset="11145638" lat="55.7267624" lon="37.4482324"/>
  <node id="31447943" version="5" timestamp="2012-11-03T01:21:58Z" uid="133332" user="AMDmi3" changeset="13729642" lat="55.7268684" lon="37.449885">
    <tag k="alt_name" v="Кунцево"/>
    <tag k="name" v="Кунцево-1"/>
    <tag k="railway" v="station"/>
  </node>
На выходе хотелось бы получить:

XML
1
2
3
4
5
6
 <node id="31447942" lat="55.7267624" lon="37.4482324"/>
  <node id="31447943" lat="55.7268684" lon="37.449885">
    <tag k="alt_name" v="Кунцево"/>
    <tag k="name" v="Кунцево-1"/>
    <tag k="railway" v="station"/>
  </node>
Есть у кого-нибудь идеи по поводу того, как можно было бы это реализовать, что бы шустро работало?
Причем исходный файл не хочется портить.

P.S я не прошу писать код, просто направьте)

Добавлено через 34 минуты
Появилась идея испольховать SAX-парсер, но как? есть ли какие-нибудь встроенные средства в MS VS или Qt?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.03.2013, 22:05
Ответы с готовыми решениями:

Редактирование XML файла
Здравствуйте. Есть файл типа: &lt;offer&gt; &lt;uniq&gt;111&lt;/uniq&gt; &lt;param&gt;001&lt;/param&gt; &lt;image&gt;image1.jpg&lt;/image&gt; &lt;/offer&gt; ...

Редактирование XML файла
Помогите пожалуйста разобраться. Eсть xml документ: &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;IPNetDescList&gt; ...

Редактирование xml-файла
Всем доброго дня, вопрос у меня такой, как изменить значение атрибута в xml файле? Вот есть у меня конфигурационный файл примерно с...

8
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
10.03.2013, 22:20
IMHO, именно построчная обработка будет быстрее любой другой. И уж точно быстрее любого разбора XML.

Выбираете очередную строку, проверяете метку "<node" (или, даже, DWORD '<nod'), если оно - обрабатываете. Читаете входной файл, пишете в выходной. Если обработку напишете корректно и без лишних библиотек, для буферизованных чтения/записи, работать будет, практически, со скоростью дискового доступа.
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.03.2013, 23:29
Цитата Сообщение от hoob Посмотреть сообщение
Задача по сути легкая, но есть одно НО :
Нифига сЕ легкая !?
Пиши сам ручками парсер если производительность не устраивает..

А нет используй готовые парсеры и выбирай наиболее быстрый
то ли boost то ли libxml2 то ли еще что ...
1
21 / 13 / 5
Регистрация: 04.11.2012
Сообщений: 89
Записей в блоге: 1
11.03.2013, 00:03  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Нифига сЕ легкая !?
Пиши сам ручками парсер если производительность не устраивает..

А нет используй готовые парсеры и выбирай наиболее быстрый
то ли boost то ли libxml2 то ли еще что ...
Начал разбираться со всем этим и понял, что не легкая) Но вот действительно нельзя ли открыть исходный файл на чтение и идти по каждой строчке, удаляя из нее ненужные данные и записывая результат удаления в новый файл ?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.03.2013, 00:47
Цитата Сообщение от hoob Посмотреть сообщение
Но вот действительно нельзя ли открыть исходный файл на чтение и идти по каждой строчке, удаляя из нее ненужные данные и записывая результат удаления в новый файл ?
Можно...
1
21 / 13 / 5
Регистрация: 04.11.2012
Сообщений: 89
Записей в блоге: 1
11.03.2013, 01:15  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Можно...
Вот что-то набросал, но в итоге не хочет работать
P.S я понимаю, что желаемого результата с этой функцией не достигнуть, но я просто хотел проверить будут ли теги (само название) удаляться или нет. В итоге вообще ничего не происходит:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void removeAdditionalData(){
    string line,text;
    string tag[]={"version", "timestamp", "uid", "user"};
    ifstream infile("input.osm");
    cout << "Input file successfully opened. Removing unnecessary data..." << endl;
    ofstream outfile("output.osm", ios::app);
    while(getline(infile,line)){
        text = line;
        int pos[4];
        for (int i=0; i<4; i++){
            pos[i]=(int)text.find(tag[i]);
            text.erase(pos[i], tag[i].size());
            outfile<<text<<endl;
        }                
    }
    
}
input.osm лежит в той же директории, что и main.cpp
его содержимое:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<node id="26999674" version="5" timestamp="2011-10-09T20:45:30Z" uid="397326" user="trolleway" changeset="9517192" lat="55.7809694" lon="37.6519289"/>
  <node id="26999676" version="7" timestamp="2011-10-14T22:26:04Z" uid="260756" user="Felis Pimeja" changeset="9559827" lat="55.7828507" lon="37.6509276"/>
  <node id="26999677" version="6" timestamp="2011-10-14T22:26:04Z" uid="260756" user="Felis Pimeja" changeset="9559827" lat="55.7843061" lon="37.6498359"/>
  <node id="26999678" version="5" timestamp="2011-10-14T22:26:04Z" uid="260756" user="Felis Pimeja" changeset="9559827" lat="55.7851798" lon="37.649104"/>
  <node id="26999679" version="5" timestamp="2011-10-14T22:26:04Z" uid="260756" user="Felis Pimeja" changeset="9559827" lat="55.786863" lon="37.6478285"/>
  <node id="26999680" version="5" timestamp="2011-10-14T22:26:04Z" uid="260756" user="Felis Pimeja" changeset="9559827" lat="55.7884413" lon="37.646466"/>
  <node id="26999681" version="6" timestamp="2011-10-14T22:26:04Z" uid="260756" user="Felis Pimeja" changeset="9559827" lat="55.7892513" lon="37.6456758"/>
  <node id="26999683" version="5" timestamp="2011-10-14T22:26:04Z" uid="260756" user="Felis Pimeja" changeset="9559827" lat="55.7922787" lon="37.6418993"/>
  <node id="26999684" version="6" timestamp="2011-10-14T22:26:04Z" uid="260756" user="Felis Pimeja" changeset="9559827" lat="55.7938566" lon="37.6396945"/>
  <node id="26999696" version="4" timestamp="2011-10-14T22:26:04Z" uid="260756" user="Felis Pimeja" changeset="9559827" lat="55.8221803" lon="37.595673"/>
  <node id="26999708" version="5" timestamp="2012-09-20T01:24:18Z" uid="384109" user="misha yakin" changeset="13177843" lat="55.8537674" lon="37.5464948"/>
  <node id="26999713" version="10" timestamp="2012-09-20T01:24:19Z" uid="384109" user="misha yakin" changeset="13177843" lat="55.8641843" lon="37.5225617"/>
  <node id="26999715" version="12" timestamp="2012-09-20T01:24:19Z" uid="384109" user="misha yakin" changeset="13177843" lat="55.8684147" lon="37.5125851"/>
  <node id="26999728" version="13" timestamp="2012-09-20T01:24:19Z" uid="384109" user="misha yakin" changeset="13177843" lat="55.8890872" lon="37.4640548"/>
  <node id="26999733" version="5" timestamp="2012-03-20T23:38:20Z" uid="336354" user="esaulenka" changeset="11047127" lat="55.8959075" lon="37.4480118"/>
  <node id="26999978" version="3" timestamp="2009-12-24T10:14:46Z" uid="44234" user="Zanuda" changeset="3440917" lat="55.9384819" lon="37.347312"/>
  <node id="26999979" version="5" timestamp="2012-03-20T23:38:20Z" uid="336354" user="esaulenka" changeset="11047127" lat="55.9403533" lon="37.3411106"/>
  <node id="26999981" version="10" timestamp="2012-11-13T15:32:58Z" uid="133332" user="AMDmi3" changeset="13860823" lat="55.9419177" lon="37.3341215">
Не пойму где я налажал(
0
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
11.03.2013, 01:31
самая долгая часть работы здесь - это чтение/запись.
запись результата будет все равно производиться последовательно, так что на ней сэкономить не выйдет.
остальное же можно распараллелить. а читать из файла блоками. как вариант.
1
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
11.03.2013, 01:47
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
   
        std::string str;  
        std::string::size_type stposit = 0;
        std::string::size_type endposit = 0;
 
        while (std::getline(infile, str, '>')) 
        {
            if ((stposit = str.find("version")) != std::string::npos)
                  if ((endposit = str.find("lat")) != std::string::npos)
             str.erase(stposit, endposit - stposit);
            str += '>';
            std::cout << str << std::endl;
            outfile << str;
        }
1
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
11.03.2013, 02:48
C boost::regex, не знаю, насколько он быстрый:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <vector>
#include <string>
 
#include <boost/regex.hpp>
 
 
std::string make_regex_expression(std::vector<std::string> const& attributes) {
   static std::string const rightPart = "\\s*=\\s*\".*?\"\\s*";
   
   std::string result;
   
   if (!attributes.empty()) {
      result = "(" + attributes.front() + rightPart + ")";
      for (std::size_t i = 1; i != attributes.size(); ++i) {
         result += "|(" + attributes[i] + rightPart + ")";
      }
   }
   
   return result;
}
 
void skip_some_attributes(
      std::istream & istream
    , std::ostream & ostream
    , std::vector<std::string> const& attributes) {
       
   boost::regex const regex(make_regex_expression(attributes));
   
   for (std::string line; std::getline(istream, line); ) {
      ostream << boost::regex_replace(line, regex, std::string()) << std::endl;
   }
}
 
 
int main() {
   std::vector<std::string> const ignoredAttributes = {
         "timestamp"
       , "uid"
       , "user"
       , "changeset"
   };
   
   skip_some_attributes(std::cin, std::cout, ignoredAttributes);
}
http://liveworkspace.org/code/1E9aXc
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.03.2013, 02:48
Помогаю со студенческими работами здесь

Редактирование XML-файла
Есть большой XML-файл в котором множество незакрытых тэгов. Т.е. файл такого вида: &lt;teg&gt;Какие-то данные &lt;drugoy_teg&gt;Еще...

Редактирование файла xml
Доброй ночи!!! Кому не трудно, объясните нормально работу ( на примере ) стандартного парсера xmldocument. Необходимо загрузить текст...

Редактирование записи из xml файла
скажите пожалуйста как вызвать форму с данными из xml файла для редактирования, заранее благодарен

Редактирование файла в формате XML
Есть файл, имеющий структуру xml. В разделе &lt;Profile&gt;&lt;StorageRoot&gt;&lt;AcApData&gt;&lt;HideableDialogs&gt;&lt;HideableDialog...

Java и Xml. Редактирование существующего файла
Здравствуйте! Есть XML файл: &lt;users&gt; &lt;user role=&quot;user&quot;&gt; &lt;name&gt;vasya&lt;/name&gt; &lt;/user&gt; &lt;user...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru