Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите реализовать функцию-парсер XML
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Обработка XML
Litkevich Yuriy
Самому некогда разбираться с XML поэтому прошу помочь, а именно написать за меня функцию.
Задача такая. Есть файлы *.ts как выглядят можно посмотреть в каталоге %QTDIR%/translations. В них есть понятие контекст:
<context>
    <name>AboutDialog</name>
    <message>
        <location filename="trwindow.cpp" line="970"/>
        <source>Qt Linguist</source>
        <translation>Qt Linguist</translation>
    </message>
</context>

из файла нужно извлечь имена всех контекстов, в приведенном фрагменте это AboutDialog, выглядеть функция должна, например, так:
QStringList GetListFrom(QFile *tsfile);

Т.е. я передаю файл в функцию, а она мне возвращает список имен контекстов.

Может кто осилит?
ViGOur
Примерно так, можно перечислить все ветки name:
#include <QtCore/QCoreApplication>

#include <QDomDocument>
#include <QFile>
#include <QStringList>

QStringList GetListFrom(QFile *device)
{
    QStringList list;

    QString errorStr;
    int errorLine;
    int errorColumn;
    QDomDocument doc;
    if (!doc.setContent( device, false, &errorStr, &errorLine, &errorColumn))
    {
        qDebug( "%s", QObject::tr("Parse 2 error at line %1, column %2:\n%3")
                        .arg(errorLine)
                        .arg(errorColumn)
                        .arg(errorStr));
        return list;
    }

    QDomElement root = doc.firstChildElement("TS");
    QDomElement context = root.firstChildElement("context");
    QString szValue = context.nodeValue();
    for(; !context.isNull(); context = context.nextSiblingElement("context"))
    {
        QDomElement name = context.firstChildElement( "name");
        QString szName = name.nodeName();
        QString szValue = name.nodeValue();

        list.append( szValue);

        qDebug( "%s=%s", qPrintable( szName), qPrintable( szValue));
    }

    return list;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QFile device("D:\\LIBS\\qt\\ce4.3.0\\translations\\designer_de.ts");
    device.open( QIODevice::ReadOnly);
    GetListFrom( &device);

    return a.exec();
}
только вот пока не могу понять, как получить значение ветки (szValue), в моем варианте оно всегда пустое... :(
Litkevich Yuriy
вот поэтому я и прошу помощи, т.к. времени на разбор полетов не могу выкроить, но тебя могу успокоить, пример %QTDIR%\examples\itemviews\simpledommodel
тоже невидит имя контекста :D

Я думаю, все эти САКСы и ДОМы, есть ересь, надо какой-нибудь интелектуальнотупой метод, чтобы интелект заканчивался на понимании элементов (тэгов) как таковых, и перебирать это все в ручную, наманер этого:
если попался открывающийся тэг, то читаем текст после него до следующего тега.....
как-то так :)

PS Хотя нет, я вру видит, не там смотрел :sorry:
Tonal
Вместо nodeValue() нужно использовать text().
Litkevich Yuriy
Tonal, в яблочко!
вместо
QString szValue = name.nodeValue();

сделал
QString szValue = name.text();


Итог:
TS File:  "H:/Qt/4.3.4/STD/translations/designer_ru.ts"
0 :  "name" = "FormWindowSettings"
1 :  "name" = "NewForm"
2 :  "name" = "Oubliette"
3 :  "name" = "PluginDialog"
4 :  "name" = "PreferencesDialog"
5 :  "name" = "QDesigner"
6 :  "name" = "QDesignerActionEditor"
7 :  "name" = "QDesignerActions"
8 :  "name" = "QDesignerFormWindow"
9 :  "name" = "QDesignerObjectInspector"
10 :  "name" = "QDesignerPropertyEditor"
11 :  "name" = "QDesignerResourceEditor"
12 :  "name" = "QDesignerSignalSlotEditor"
13 :  "name" = "QDesignerWidgetBox"
14 :  "name" = "QDesignerWorkbench"
15 :  "name" = "QObject"
16 :  "name" = "SaveFormAsTemplate"
17 :  "name" = "VersionDialog"


---
Так сказать от имени и по поручению и т.д. и т. п. ВСЕМ СПАСИБО!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.