Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Sph
158 / 42 / 10
Регистрация: 25.08.2014
Сообщений: 345
1

Выбор для xml парсинга

20.01.2015, 17:05. Просмотров 1693. Ответов 24
Метки нет (Все метки)

Приветствую всех.
Помогите пожалуйста советом, что лучше взять для парса xml файла.
Что есть у меня:
- файлы могут быть как очень маленькими (10-50 строк) так и очень большими (100-200 тысяч строк)
- мне надо только парсить (читать и разбирать) документы, никаких изменений и добавлений
- данные из файла надо сразу разбирать в массив-структуру массивов чтобы потом использовать нужные части в программе
- я знаю все возможные теги\дерево тегов которое будет использоваться в том или ином xml файле

1. QXmlSimpleReader - судя по описанию не очень подходит, брать по кускам, читать только текущий тег и ничего не знать о ранних вызовах
2. QXmlStreamReader - быстрый, что является плюсом в разборе более 100 тысяч строк, но не знает ничего об иерархии документа, но иерархию знаю я(можно ли это как то использовать?)
3. QDomDocument - выглядит очень привлекательно, тк видит все дерево сразу и я могу найти нужный мне тег и параметр моментально, но начинает жрать память. На сколько это критично на слабых компах и при разборе огромного файла?
4. забить на Qt и тащить boost и просто ползать по строкам (но опять таки, маленький файл ерунда, большой - проблема)

Что лучше использовать, или на что обратить внимание, на что опираться при выборе? Пока на вскидку только 2 и 3 варианты. Как обстоят дела с похожими вложенными тегами?

Например:

XML
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
46
47
48
49
50
51
52
53
<maintree>
    <childs>
        <first_tr>
            <childs>
                <object1>
                    <name>"Стол обеденный"</name>
                    <size>"205x45x98"</size>
                    <options>"Продажа"</options>
                </object1>  
                <object2>
                    <name>"Стол компьютерный"</name>
                    <size>"150x58x100"</size>
                    <options>"Покупка"</options>
                </object2>  
                <objectN>
                    <name>"Стол журнальный"</name>
                    <size>"85x35x50"</size>
                    <options>"Продажа"</options>
                </objectN>  
            </childs>
        <options>
        <about>"First"</about>
        <size>"562"</size>
        </options>
        </first_tr>
        <second_tr>
            <childs>
                <object1>
                    <name>"Стул офисный"</name>
                    <size>"30x45x95"</size>
                    <options>"Покупка"</options>
                </object1>  
                <objectN>
                    <name>"Стул компьютерный"</name>
                    <size>"45x45x60"</size>
                    <options>"Продажа"</options>
                </objectN>  
            </childs>
        <options>
        <about>"Second"</about>
        <size>"41"</size>
        </options>
        </second_tr>
    </childs>
    <options>
        <size>"N"</size>
        <about>"Ассортимент"</about>
        <informations>"Покупка-продажа"</informations>
    </options>
    <other>
        <version>"Ver. 2.1.3"</version>
    </other>
</maintree>
childs, options встречаются не раз в разных вложениях.
К примеру QXmlStreamReader может как то "понять" что в одном случае тег относится к одному вложению, а потом к другому?

заранее спасибо за любые ответы!

Добавлено через 20 минут
PS. как вариант просто использовать QString и идти по шагам, но это на сколько огромный шаблон придется писать тех же switch-case-ов чтобы разобрать файл, хотя бы один.

Добавлено через 4 минуты
PPS. или вообще забить на Qtшные средства и использовать что-то из чистого С++?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2015, 17:05
Ответы с готовыми решениями:

Класс парсинга xml
Нужно реализовать метод класса, который ищет нужный элемент, имя которого передается методу извне....

QT - класс для парсинга сайтов
Здравствуйте! Я совсем недавно начал изучать QT. Раньше изучал только С++. Сейчас стоит задача...

Библиотека для xml парсинга
Доброго времени суток. У меня появилась необходимость чтения xml из потока (файлы будут...

Посоветуйте библиотеку для парсинга XML (xdxf)
Здравствуйте. Есть словари в формате xdxf. Кто не знаком xdxf - это, как по мне, сильно неудачная...

Математические алгоритмы для парсинга текста из word и xml
Здравствуйте, какие есть математические алгоритмы для парсинга текста из word или xml или похожих....

24
Sph
158 / 42 / 10
Регистрация: 25.08.2014
Сообщений: 345
22.01.2015, 17:09  [ТС] 21
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
Понимаю. Однако в данном случае лучше всё же использовать Qt, потому как QIODevice завязан на Qt.
Или есть обход - считайте весь файл в память с помощью fread или аналогичной функции, а затем передайте полученный результат его(char*) в QByteArray. QByteArray вы уже сможете применить с QXmlStreamReader.
это не вариант, тк файлы могут быть огромными, 100-200 тысяч строк например. Память не резиновая и работать надо быстро. С таким подходом можно было брать QDomDocument
*Может и лучше использовать только средства qt но для этого нужны обоснования. И весомые, а не "у меня не получилось открыть файл и я использовал чисто кути). Да и в описании qt пишется, это инструментарий для написания на с++, в итоге становится сложнее доказать, почему нельзя или не стоит использовать чистый с++
0
Shtirliz72
202 / 162 / 41
Регистрация: 25.10.2013
Сообщений: 527
22.01.2015, 17:22 22
Цитата Сообщение от Sph Посмотреть сообщение
это не вариант, тк файлы могут быть огромными, 100-200 тысяч строк например. Память не резиновая и работать надо быстро. С таким подходом можно было брать QDomDocument
*Может и лучше использовать только средства qt но для этого нужны обоснования. И весомые, а не "у меня не получилось открыть файл и я использовал чисто кути). Да и в описании qt пишется, это инструментарий для написания на с++, в итоге становится сложнее доказать, почему нельзя или не стоит использовать чистый с++
Не понимаю. 100-200 тысяч строк это пара мегабайт. Если оперативы настолько мало, что пара мегабайт имеет роль, то смысл вообще использовать Qt? Если же файл действительно очень большой - то ты всегда можешь считывать его по частям, кто тебе мешает?
Работать быстрее? Что может быть быстрее работы с оперативной памятью?
QDomDocument? Так он всё равно работает только с Qt.

Если тебе не нравится предложенный вариант, я ещё раз повторю, ты всегда можешь отнаследоваться от QIODevice и написать там всё что тебе хочется.
0
Sph
158 / 42 / 10
Регистрация: 25.08.2014
Сообщений: 345
22.01.2015, 17:41  [ТС] 23
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
Если тебе не нравится предложенный вариант, я ещё раз повторю, ты всегда можешь отнаследоваться от QIODevice и написать там всё что тебе хочется.
Спасибо за предложенный вариант, я подумаю что можно сделать
0
RazrFalcon
1393 / 1250 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
22.01.2015, 17:46 24
Цитата Сообщение от Sph Посмотреть сообщение
при сборке сишка цепляет из либ только то что надо, какого лешего кути тянет ВСЕ и сразу и зачем.
Какая еще сишка, мы сейчас про С++ говорим.

Qt тоже цепляет все что нужно. А нужно ему много.

Цитата Сообщение от Sph Посмотреть сообщение
почему обычный с++ проект весит 1-2 мб
Потому что тянет за собой только stdc++. Который и весит в районе 2мб. А Qt весит ~15Мб.
Ответ я уже писал выше: Qt умеет на порядки больше - вот и весит больше.
0
Shtirliz72
202 / 162 / 41
Регистрация: 25.10.2013
Сообщений: 527
22.01.2015, 18:09 25
Цитата Сообщение от Sph Посмотреть сообщение
Просто банально на вопрос - почему обычный с++ проект весит 1-2 мб а кутишный 15?
Говорят, что можно сделать и меньше - используя Qt c VS.
0
22.01.2015, 18:09
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2015, 18:09

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Нет нужного класса в библиотеке для парсинга XML
Всем привет! Вчера начал изучать C# для написания логики под среду playerIO. Столкнулся вот с...

Выбор языка программирования для парсинга
Уважаемые форумчане помогите с выбором языка программирования для парсинга веб страниц.

Обработка ошибки при загрузке для парсинга xml файла
помогите пожалуйста как сделать действие чтоб при ошибке загрузки файла по ссылке можно было это...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Опции темы

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