Russian Qt Forum
Май 17, 2024, 04:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: [решено] Чтение XML, запись XML  (Прочитано 47908 раз)
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 871


Мы должны приносить пользу людям.


Просмотр профиля
« : Январь 06, 2010, 17:10 »

Коллеги!
Подскажите, пожалуйста, правильно ли я понял - при чтении и обработке содержимого xml-файлов большого размера (сотни кбайт - десятки Мбайт) средствами Qt следует использовать QXmlSimpleReader, для записи результатов в xml-файл - QXmlStreamWriter?

DOM прошу не предлагать, не подходит. С SAX понятно - для чтения, а вот примеров создания xml-файлов нашел немного. Особенно порадовал SAX Bookmarks Example Грустный
Спасибо.
« Последнее редактирование: Март 21, 2010, 15:39 от tramp_0 » Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Akaiten
Гость
« Ответ #1 : Январь 15, 2010, 15:46 »

Для чтения использую QXmlStreamReader, для создания QXmlStreamWriter. А что с созданием непонятно? это ж проще пареной репы. Например

Код
C++ (Qt)
QXmlStreamWriter xml;
/*...*/
xml.writeStartElement("a");
xml.writeAttribute("href", "#");
xml.writeStartElement("img");
xml.writeAttribute("src", "image.jpg");
xml.writeAttribute("alt", "image");
xml.writeEndElement();
xml.writeCharacters("This is a link");
xml.writeEndElement();
xml.writeTextElement("p", "This is a paragraph");
 

Должно получиться что то вроде этого
Код
XML
<a href="#">
 <img src="image.jpg" alt="image"/>
 This is a link
</a>
<p>This is a paragraph</p>
 

Добавлено 18.01.2010 11:14: Забыл закрывающий тег для <img> Улыбающийся
« Последнее редактирование: Январь 18, 2010, 11:15 от Akaiten » Записан
Marat(Qt)
Гость
« Ответ #2 : Январь 16, 2010, 16:29 »

Должно получиться что то вроде этого
Код
XML
<a href="#">
 <img src="image.jpg" alt="image">
 This is a link
</a>
<p>This is a paragraph</p>
 
Тэг img не закрыт
Записан
Resager
Гость
« Ответ #3 : Январь 16, 2010, 22:02 »

Тэг img не нуждается в закрытии, однако по стандарту XHTML 1.0 нужно дописывать (для такого типа тэгов) в конце "/"

Как то: <img src="image.jpg" alt="image" />
(читать здесь http://stepbystep.htmlbook.ru/?id=63)

Неужели там это непридусмотрено? Грустный

Мне как раз понадобится работа с XML файлами... не подскажете ли (пару примерчиков) чтения XML-файла?
Меня особенно интересует, можно ли "добавлять" в XML, в середину, текст большей размерности
(буду использовать по прототипу БД, для хранения многострочных текстовых данных), не использую нормальные БД по причине того. что поле ограниченной длины.
Например было:
Код
XML
<root24>
  <group1>
     <string1 key="comment" value="string1"/>
     <string2 key="comment" value="string2"/>
  </group1>
</root24>

Стало:

Код
XML
<root24>
  <group1>
     <string1 key="comment" value="string1"/>
     <string2 key="comment" value="string2"/>
     <string3 key="comment" value="string3"/>
  </group1>
</root24>
(
Ну и конечно чтобы это быстро было.
« Последнее редактирование: Январь 16, 2010, 22:16 от Resager » Записан
Marat(Qt)
Гость
« Ответ #4 : Январь 16, 2010, 23:09 »

Если положите это в value=... (т.е. в атрибут), то наткнетесь на ту же проблему что и в соседнем топике http://www.prog.org.ru/topic_11648_0.html
Если будете активно DOM использовать - то вся база будет в ОЗУ лежать, а так вполне ничего. Жить можно будет.
Записан
Resager
Гость
« Ответ #5 : Январь 17, 2010, 13:02 »

Есть хорошие примеры для работы с DOM? Это хорошо, с одной стороны, что хранится будет в ОЗУ, и быстро, и как вы говорите проблем меньше, а если мне не охота нагружать ОЗУ этив файлом, ибо предпологается большой размер файла (~100 мб максимум). Думаю надо проверить на быстродействие оба варианта, и если видимого отличия не будет, тогда лучше не занимать память.
Класть мне всё равно куда, хотя в "KEY", хоть вообще между тэгами (ибо придётся как уже говорил как то многострочные текстовые блоки хранить).
Так сможете подсказать?

З.Ы. В примере выше не показано, как например подключать файл, если не сложно. покажите?!
« Последнее редактирование: Январь 17, 2010, 13:04 от Resager » Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 871


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #6 : Январь 17, 2010, 14:30 »

Для чтения использую QXmlStreamReader, для создания QXmlStreamWriter. А что с созданием непонятно? это ж проще пареной репы. Например

Код
C++ (Qt)
QXmlStreamWriter xml;
/*...*/
xml.writeStartElement("a");
xml.writeAttribute("href", "#");
xml.writeStartElement("img");
...
 
Я бы не назвал это пареной репой Улыбающийся Однако ход мысли понятен, спасибо. Предстоит много нудной и противной работы  Грустный
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Marat(Qt)
Гость
« Ответ #7 : Январь 17, 2010, 15:11 »

Есть хорошие примеры для работы с DOM? Это хорошо, с одной стороны, что хранится будет в ОЗУ, и быстро, и как вы говорите проблем меньше, а если мне не охота нагружать ОЗУ этив файлом, ибо предпологается большой размер файла (~100 мб максимум). Думаю надо проверить на быстродействие оба варианта, и если видимого отличия не будет, тогда лучше не занимать память.
Класть мне всё равно куда, хотя в "KEY", хоть вообще между тэгами (ибо придётся как уже говорил как то многострочные текстовые блоки хранить).
Так сможете подсказать?


У xml есть язык запросов - XQuery, не знаю как он для вставки (по сути должны быть средства) но вот для чтения очень даже. Составляете запрос и получаете конкретную строку или набор строк, удовлетворяющих запросу.
Записан
Akaiten
Гость
« Ответ #8 : Январь 18, 2010, 11:19 »

Меня особенно интересует, можно ли "добавлять" в XML, в середину, текст большей размерности
...
Ну и конечно чтобы это быстро было.

Обычно, чтобы изменить XML файлик требуеться его полностью прочитать (и обычно распарсить) в память.
Записан
Resager
Гость
« Ответ #9 : Январь 18, 2010, 16:29 »

Обычно, чтобы изменить XML файлик требуеться его полностью прочитать (и обычно распарсить) в память.
Ну это логично, по другому думаю никак, даже текстовый файл...
Как происходит загрузка в память XML-файла и его парсинг, что для этого есть в QT?
Записан
Marat(Qt)
Гость
« Ответ #10 : Январь 18, 2010, 16:50 »

Обычно, чтобы изменить XML файлик требуеться его полностью прочитать (и обычно распарсить) в память.
Ну это логично, по другому думаю никак, даже текстовый файл...
Как происходит загрузка в память XML-файла и его парсинг, что для этого есть в QT?
Для этого есть DOM. Он загружает весь файл и строит из него дерево, по которому вы можете ходить, читая/добавляя/удаляя ветки. Все это достаточно подробно описал М.Шлее.
Записан
Akaiten
Гость
« Ответ #11 : Январь 18, 2010, 17:03 »

Обычно, чтобы изменить XML файлик требуеться его полностью прочитать (и обычно распарсить) в память.
Ну это логично, по другому думаю никак, даже текстовый файл...
Как происходит загрузка в память XML-файла и его парсинг, что для этого есть в QT?

Могу ещё раз написать, что я, например, использую QXmlStreamReader. Если структура XML довольна проста, то при помощи QXmlStreamReader его можно просто и быстро распарсить. В качестве примера смотри Qt\tools\linguist\shared\ts.cpp - парсер TS-файлов. Также для чтения можно использовать QXmlSimpleReader (ни разу не использовал) или QDomDocument.
Записан
SABROG
Гость
« Ответ #12 : Январь 21, 2010, 10:12 »

QXmlStreamReader это StAX, по сути может работать с любым объемом, на его основе можно построить сетевой протокол на базе xml запросов и ответов. Т.е. ему всё равно какого размера файл, он будет работать. Из недостатков - только для чтения, только forward cursor, т.е. нельзя вернуться в предыдущую ноду и посмотреть чего там было, код парсера получается некрасивым, не понятным, много оверхеда (повторяющегося кода). Зато хорошо работает.
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 871


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #13 : Январь 28, 2010, 22:07 »

Коллеги, в продолжение темы.
При записи с помощью QXmlStreamWriter xml-документа нужно, чтобы в декларацию xml записывалась кодировка, типа <?xml version="1.0" encoding="WINDOWS-1251"?>.
Курю assistant, в котором говорится что при использовании QXmlStreamWriter::setCodec ( QTextCodec * codec ) the encoding information is stored in the initial xml tag. Главное, чтобы вызов this function был before calling writeStartDocument().
Пишу
    QXmlStreamWriter writer;
    writer.setCodec("WINDOWS-1251");
    writer.writeStartDocument();
Фигвам. В созданном документе декларация выглядит как <?xml version="1.0"?> без encoding.
Думал, что кодек кривой, так нет - если сделать
    QTextCodec * c=writer.codec();
    QString sc=c->name();
то sc показывает правильно: windows-1251. Пробовал разную кодировку, в том числе UTF, все едино...
Подскажите, как правильно сформировать декларацию в прологе?
Гуру, ау!!!
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
BRE
Гость
« Ответ #14 : Январь 28, 2010, 22:28 »

Попробуй воспользоваться этим:
void QXmlStreamWriter::writeProcessingInstruction ( const QString & target, const QString & data = QString() )
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.094 секунд. Запросов: 19.