crossplatform.ru

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

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Xml - обращение к дочернему элементу
Kagami
  опции профиля:
сообщение 28.3.2009, 9:16
Сообщение #11


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

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




Репутация:   9  


Цитата(Litkevich Yuriy @ 28.3.2009, 3:34) *
по моему опыту, лучше избегать применения этой функции, т.к. она рекурсивная, т.е. схватит все вложенные тэги, часто это неподходящий вариант. Лучше использовать data() или value().

Хм.. Что-то я сходу не нашел таких функций у QDomElement и у QDomDocument ни у их родителя QDomNode..

P.S. Выздоравливай скорее
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FladeX
  опции профиля:
сообщение 7.4.2009, 11:15
Сообщение #12


Студент
*

Группа: Участник
Сообщений: 67
Регистрация: 20.2.2009
Пользователь №: 564

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




Репутация:   0  


Kagami, спасибо большое! Мне как раз надо чтобы от положения элемента в xml не зависел его выбор.
Но ошибка так и остается:
expertsystem.cpp:174: error: jump to case label                                                                                                                      
expertsystem.cpp:163: error:   crosses initialization of ‘QDomElement child’                                                                                        
expertsystem.cpp:162: error:   crosses initialization of ‘QDomElement root’                                                                                          
expertsystem.cpp:161: error:   crosses initialization of ‘QDomDocument domDocument’

Что за ошибка вообще такая?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 7.4.2009, 11:28
Сообщение #13


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Видимо у вас в коде есть что то вроде такого
     switch (i) {
     case 1:
         int j = 1;
         break;
     case 2:
         int j = 2;
         break;
     }

Так делать нельзя. Определение int j нужно вынести
     switch (i) {
     int j;
     case 1:
         j = 1;
         break;
     case 2:
         j = 2;
         break;
     }


Сообщение отредактировал igor_bogomolov - 7.4.2009, 11:28
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 7.4.2009, 11:45
Сообщение #14


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

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

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




Репутация:   94  


Цитата(Kagami @ 28.3.2009, 13:16) *
Хм.. Что-то я сходу не нашел таких функций у QDomElement и у QDomDocument ни у их родителя QDomNode..
вот кусочки из моего кода:
void XmlStalker::SelfPortrait(const QDomNode &n, int rid, int id)
{
...
value= n.nodeValue().simplified();
...
t = n.toText();
data = t.data().simplified();
...
}
насчёт value() неправ, должно быть nodeValue()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FladeX
  опции профиля:
сообщение 7.4.2009, 13:03
Сообщение #15


Студент
*

Группа: Участник
Сообщений: 67
Регистрация: 20.2.2009
Пользователь №: 564

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




Репутация:   0  


Итак, currentId() содержит айдишник текущей страницы. Обработка нажатия на кнопку "Помощь" (только основное):
cpp
    QString pageid = QString::number(currentId());

    QDomDocument domDocument;
    QDomElement root = domDocument.documentElement();
    QDomElement help = root.firstChildElement("help");
    QDomElement child = help.firstChildElement("page");
    while (!child.isNull())
    {
        if (child.attribute("id") == pageid)
        {
            QDomElement mess = child.firstChildElement("message");
            message = mess.text();
            //message = pageid;
        }
        child = child.nextSiblingElement("page");
    }

И вот такой структуры xml файл есть:
xml
<?xml version="1.0" ?>
<!-- Help data -->
<help>
    <page id="0">
        <title>title0</title>
        <message>message0</message>
    </page>
    <page id="1">
        <title>title1</title>
        <message><![CDATA[message1]]></message>
    </page>
</help>

Но почему-то переменная message пуста...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 7.4.2009, 13:36
Сообщение #16


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

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

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




Репутация:   94  


FladeX, У меня есть тестовая программа по которой я изучал QDOM, вот что она расказывает о твоём файле:
Раскрывающийся текст

Сейчас 07.04.2009 17:36:39.609
Addr: 0, 0
Type: DocumentNode
Name: #document
AName:
Value:
AValue:
Data:
Text:
I have a 3 children
-------------------------------------------------
Addr: 0, 1
Type: ProcessingInstructionNode
Name: xml
AName:
Value: version='1.0'
AValue:
Data:
Text:
I havn't a children
-------------------------------------------------
Addr: 0, 2
Type: CommentNode
Name: #comment
AName:
Value: Help data
AValue:
Data:
Text:
I havn't a children
-------------------------------------------------
Addr: 0, 3
Type: ElementNode
Name: help
AName:
Value:
AValue:
Data:
Text: title0message0title1message1
I have a 2 children
-------------------------------------------------
Addr: 3, 4
Type: ElementNode
Name: page
AName:
Value:
AValue:
Data:
Text: title0message0
I have a 2 children
-------------------------------------------------
Addr: 4, 5
Type: ElementNode
Name: title
AName:
Value:
AValue:
Data:
Text: title0
I have a 1 children
-------------------------------------------------
Addr: 5, 6
Type: TextNode
Name: #text
AName:
Value: title0
AValue:
Data: title0
Text:
I havn't a children
-------------------------------------------------
Addr: 4, 7
Type: ElementNode
Name: message
AName:
Value:
AValue:
Data:
Text: message0
I have a 1 children
-------------------------------------------------
Addr: 7, 8
Type: TextNode
Name: #text
AName:
Value: message0
AValue:
Data: message0
Text:
I havn't a children
-------------------------------------------------
Addr: 3, 9
Type: ElementNode
Name: page
AName:
Value:
AValue:
Data:
Text: title1message1
I have a 2 children
-------------------------------------------------
Addr: 9, 10
Type: ElementNode
Name: title
AName:
Value:
AValue:
Data:
Text: title1
I have a 1 children
-------------------------------------------------
Addr: 10, 11
Type: TextNode
Name: #text
AName:
Value: title1
AValue:
Data: title1
Text:
I havn't a children
-------------------------------------------------
Addr: 9, 12
Type: ElementNode
Name: message
AName:
Value:
AValue:
Data:
Text: message1
I have a 1 children
-------------------------------------------------
Addr: 12, 13
Type: CDATASectionNode
Name: #cdata-section
AName:
Value: message1
AValue:
Data: message1
Text:
I havn't a children
-------------------------------------------------
END of tree
Если надо могу дать её исходник. (правда её нужно доработать, чтобы атрибуты печатала)

П.С. к сожалению DOM не интуитивен, и после паузы в работе с ним всё вылетает из головы. поэтому даже немогу подсказать в чём у тебя ошибка.

Здесть "Addr: *, *" условный адрес узла (адрес родителя, адрес текущего )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 7.4.2009, 14:12
Сообщение #17


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

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




Репутация:   9  


А какая область видимости у переменной message?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FladeX
  опции профиля:
сообщение 7.4.2009, 14:30
Сообщение #18


Студент
*

Группа: Участник
Сообщений: 67
Регистрация: 20.2.2009
Пользователь №: 564

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




Репутация:   0  


Только внутри функции. Используется для QMessageBox и все.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 7.4.2009, 17:19
Сообщение #19


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

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




Репутация:   9  


В приведенном выше кусочке вроде ошибок не видно. Было бы неплохо глянуть на весь код этой процедуры

Сообщение отредактировал Kagami - 7.4.2009, 17:20
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FladeX
  опции профиля:
сообщение 8.4.2009, 11:59
Сообщение #20


Студент
*

Группа: Участник
Сообщений: 67
Регистрация: 20.2.2009
Пользователь №: 564

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




Репутация:   0  


Вот функция целиком:
cpp
void ExpertSystem::showHelp()
{
    static QString lastHelpMessage;

    QString message;
    QDomDocument doc;
    QFile file("/home/opensuse/qt/expertsystem/help.xml");
    if (!file.exists())
    {
        QMessageBox::warning(this, QObject::trUtf8("Предупреждение"), QObject::trUtf8("Ошибка 001. Файл help.xml не существует"));
    }
    if (!file.open(QIODevice::ReadOnly))
    {
        QMessageBox::warning(this, QObject::trUtf8("Предупреждение"), QObject::trUtf8("Ошибка 002. Невозможно открыть файл help.xml"));
        return;
    }
    if (!doc.setContent(&file))
    {
        QMessageBox::warning(this, QObject::trUtf8("Предупреждение"), QObject::trUtf8("Ошибка 003. Невозможно прочитать файл help.xml"));
        file.close();
        return;
    }
    doc.setContent(&file);

    QString pageid = QString::number(currentId());

    QDomDocument domDocument;
    QDomElement root = domDocument.documentElement();
    QDomElement help = root.firstChildElement("help");
    QDomElement child = help.firstChildElement("page");
    while (!child.isNull())
    {
        if (child.attribute("id") == pageid)
        {
            QDomElement mess = child.firstChildElement("message");
            message = mess.text();
            //message = pageid;
        }
        child = child.nextSiblingElement("page");
    }
    file.close();

    //if (lastHelpMessage == message)
    //    message = tr("");

    QMessageBox::information(this, QObject::trUtf8("Подсказка"), message);

    lastHelpMessage = message;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 18.9.2024, 16:03