crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Помогите реализовать функцию-парсер XML, (Помогите проекту переводов)
Litkevich Yuriy
  опции профиля:
сообщение 20.5.2008, 13:48
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Самому некогда разбираться с 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
  опции профиля:
сообщение 20.5.2008, 16:59
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Примерно так, можно перечислить все ветки 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
  опции профиля:
сообщение 20.5.2008, 18:51
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


вот поэтому я и прошу помощи, т.к. времени на разбор полетов не могу выкроить, но тебя могу успокоить, пример %QTDIR%\examples\itemviews\simpledommodel
тоже невидит имя контекста :D

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

PS Хотя нет, я вру видит, не там смотрел :sorry:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 20.5.2008, 19:54
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Вместо nodeValue() нужно использовать text().
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 20.5.2008, 20:12
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


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"


---
Так сказать от имени и по поручению и т.д. и т. п. ВСЕМ СПАСИБО!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 11:51