Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
hoob
19 / 11 / 1
Регистрация: 04.11.2012
Сообщений: 89
Записей в блоге: 1
#1

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

10.03.2013, 22:05. Просмотров 975. Ответов 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?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2013, 22:05     Редактирование XML файла
Посмотрите здесь:

редактирование файла - C++
Здравствуйте помогите пл3, как это покрасивее сделать, учитывая что человек не особо разбирается в программировании Скопировать...

Редактирование части файла - C++
Всем привет! Вопрос в следующем. Я сейчас пытаюсь изменить часть текстового файла. Начало изменяемой области помечено маркером...

Редактирование текстового файла - C++
Доброго времени суток. Подскажите, пожалуйста, как решить задачу: &quot;Написать функцию, которая удаляет лишние пробелы между словами и...

Редактирование бинарного файла - C++
Суть программы - создаёт бинарный файл и записывает в него строки с количеством и наименованием товара, поставщиком и ценой. всё работает,...

Редактирование текстового файла - C++
Все привет нужна помощь Задание:Составить программу на языке С++, позволяющую отредактировать заданный с консоли текстовый файл: заменить...

Редактирование бинарного файла - C++
возможно ли написать такую функцию которая будет редактировать бинарный файл?

Текст из файла, и его редактирование - C++
Добрый вечер! Есть задача: нужно написать программу, что бы та выводила стихотворение Тютчева &quot;люблю грозу в начале мая&quot; из файла(скажем...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gazlan
3130 / 1905 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
10.03.2013, 22:20     Редактирование XML файла #2
IMHO, именно построчная обработка будет быстрее любой другой. И уж точно быстрее любого разбора XML.

Выбираете очередную строку, проверяете метку "<node" (или, даже, DWORD '<nod'), если оно - обрабатываете. Читаете входной файл, пишете в выходной. Если обработку напишете корректно и без лишних библиотек, для буферизованных чтения/записи, работать будет, практически, со скоростью дискового доступа.
Avazart
Эксперт С++
7115 / 5292 / 273
Регистрация: 10.12.2010
Сообщений: 23,385
Записей в блоге: 17
10.03.2013, 23:29     Редактирование XML файла #3
Цитата Сообщение от hoob Посмотреть сообщение
Задача по сути легкая, но есть одно НО :
Нифига сЕ легкая !?
Пиши сам ручками парсер если производительность не устраивает..

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

А нет используй готовые парсеры и выбирай наиболее быстрый
то ли boost то ли libxml2 то ли еще что ...
Начал разбираться со всем этим и понял, что не легкая) Но вот действительно нельзя ли открыть исходный файл на чтение и идти по каждой строчке, удаляя из нее ненужные данные и записывая результат удаления в новый файл ?
Avazart
Эксперт С++
7115 / 5292 / 273
Регистрация: 10.12.2010
Сообщений: 23,385
Записей в блоге: 17
11.03.2013, 00:47     Редактирование XML файла #5
Цитата Сообщение от hoob Посмотреть сообщение
Но вот действительно нельзя ли открыть исходный файл на чтение и идти по каждой строчке, удаляя из нее ненужные данные и записывая результат удаления в новый файл ?
Можно...
hoob
19 / 11 / 1
Регистрация: 04.11.2012
Сообщений: 89
Записей в блоге: 1
11.03.2013, 01:15  [ТС]     Редактирование XML файла #6
Цитата Сообщение от 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">
Не пойму где я налажал(
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
11.03.2013, 01:31     Редактирование XML файла #7
самая долгая часть работы здесь - это чтение/запись.
запись результата будет все равно производиться последовательно, так что на ней сэкономить не выйдет.
остальное же можно распараллелить. а читать из файла блоками. как вариант.
MrCold
854 / 752 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
11.03.2013, 01:47     Редактирование XML файла #8
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;
        }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2013, 02:48     Редактирование XML файла
Еще ссылки по теме:

Работа с файлами. Редактирование файла - C++
Задачка такая... переписать содержимое файла А в файл Б, удалив однобуквенные слова и пробелы.. #define _CRT_SECURE_NO_WARNINGS ...

Редактирование записи бинарного файла - C++
Здравствуйте. Подскажите пожалуйста, мне надо призвести редактирование записи в файле, данные в файл заношу через структуру: struct TZap{...

Ввод информации в стек из файла и редактирование - C++
Создать двоичный файл с информацией из таблицы. (добавить еще несколько строчек подобной информации) Добавить в файл поле &quot;Общая сумма...

Сортировка\редактирование\удаление бинарного файла - C++
Люди помогите пожалуйста... В бинарном файле у меня находятся сведения о нуждающихся в пособии. Имеются функции создания\откртия файла,...

Вывод текста из файла в консоль и его последующее редактирование - C++
Задача состоит в следующем: нужно вывести текст из файла расширением, скажем .txt, в консоль, и далее заниматься его редактированием. То...


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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
1438 / 1167 / 61
Регистрация: 21.04.2012
Сообщений: 2,436
Завершенные тесты: 3
11.03.2013, 02:48     Редактирование XML файла #9
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
Yandex
Объявления
11.03.2013, 02:48     Редактирование XML файла
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru