Russian Qt Forum

Qt => XML => Тема начата: 5serg от Июль 24, 2007, 15:16



Название: Qt 4.3.0. Как перезаписать в XML файле определенный тег
Отправлено: 5serg от Июль 24, 2007, 15:16
Проблема вот в чём.
Имеется XML файл. Каким образом найти в нём определенный тег и перезаписать в нем атрибут?
Использую DOM.


Название: Qt 4.3.0. Как перезаписать в XML файле определенный тег
Отправлено: SABROG от Июль 24, 2007, 16:00
Как это делается в libxml2 я могу сказать, а вот как в QtXml модуле я не знаю, мне кажется, что он слабоват.


Название: Qt 4.3.0. Как перезаписать в XML файле определенный тег
Отправлено: 5serg от Июль 24, 2007, 16:16
Расскажите плиз по подробнее что за libxml2. Где его взять и желательно примерчик с ним


Название: Qt 4.3.0. Как перезаписать в XML файле определенный тег
Отправлено: SABROG от Июль 24, 2007, 16:31
http://en.wikipedia.org/wiki/LibXML
http://xmlsoft.org/index.html

Кросплатформенная библиотека для работы с xml файлами изначально написанная для оболочки Gnome.

На данный момент имеет встроенный ftp, http клиент и полный набор для работы не только с XMLем, но и HTMLем, реализовано докучи популярных алгоритмов для работы с xml'eм:

    * the XML standard: http://www.w3.org/TR/REC-xml
    * Namespaces in XML: http://www.w3.org/TR/REC-xml-names/
    * XML Base: http://www.w3.org/TR/xmlbase/
    * RFC 2396 : Uniform Resource Identifiers http://www.ietf.org/rfc/rfc2396.txt
    * XML Path Language (XPath) 1.0: http://www.w3.org/TR/xpath
    * HTML4 parser: http://www.w3.org/TR/html401/
    * XML Pointer Language (XPointer) Version 1.0: http://www.w3.org/TR/xptr
    * XML Inclusions (XInclude) Version 1.0: http://www.w3.org/TR/xinclude/
    * ISO-8859-x encodings, as well as rfc2044 [UTF-8] and rfc2781 [UTF-16] Unicode encodings, and more if using iconv support
    * part of SGML Open Technical Resolution TR9401:1997
    * XML Catalogs Working Draft 06 August 2001: http://www.oasis-open.org/committees/entity/spec-2001-08-06.html
    * Canonical XML Version 1.0: http://www.w3.org/TR/xml-c14n and the Exclusive XML Canonicalization CR draft http://www.w3.org/TR/xml-exc-c14n
    * Relax NG, ISO/IEC 19757-2:2003, http://www.oasis-open.org/committees/relax-ng/spec-20011203.html
    * W3C XML Schemas Part 2: Datatypes REC 02 May 2001
    * W3C xml:id Working Draft 7 April 2004

Кстати прекрасно собирается через MinGW, разве что есть некоторые трудности с подключением zlib и iconv, но это решается.

Правда есть и подводные камни, то что отпарсит MSXML - может не отпарсить libxml2, разработчик говорит - придерживается стандартов. В общем возможны проблемы также как и с firefox'ом, там где сайты открываются в IE, могут не открываться в firefox'e. Нарушение стандарта.

Ну и по-умолчанию libxml2 работает с UTF-8, поэтому если собирать без iconv'a, то наши любимые xmlи с encoding="windows-1251" парсится не будут. Если же iconv есть, то xml отпарсится, но результат все-равно вернет в UTF-8 кодировке, т.ч. пугаться не надо.

А перезапись свойства осуществляется так:
- парсится файл
- возвращается указатель на древовидную структуру xml дерева
- проходим по дереву в поиске нужной нам ветки (ноды)
- передаем в метод xmlSetProp(нашу_ноду,имя_свойства,значение_свойства);
- сохраняем дерево в файл, если имя совпадает, то файл меняется, если нет, то создается новый.


Название: Qt 4.3.0. Как перезаписать в XML файле определенный тег
Отправлено: bigirbis от Июль 25, 2007, 09:13
Код:
QDomDocument doc;
doc.setContent( "path to file" );
QDomElement root = doc.documentElement();
QDomNodeList needList = root.elementsByTagName( "mytag" );
if( needList.count() )
{
 QDomElement needElement = needList.at( 0 );
 needElement.setAttribute( "myattribute", "123" );
}
...
... doc.toString() ...
...

Мануал стоит иногда почитывать


Название: Qt 4.3.0. Как перезаписать в XML файле определенный тег
Отправлено: 5serg от Июль 25, 2007, 09:34
Вы меня простите, я новичок в программировании, а что надо потом сделать после
doc.toString() ...
как записать изменения обратно в файл?


Название: Qt 4.3.0. Как перезаписать в XML файле определенный тег
Отправлено: bigirbis от Июль 25, 2007, 10:13
Например так:
Код:
QFile f( "myfile" );
QTextStream s( &f );
f << doc.toString();


добавлено спустя 2 минуты:

 Но вообще - читай мануал и посты форума. Ведь это форум, а не чат. Здесь левый треп ни к чему.