crossplatform.ru

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

> Xml - обращение к дочернему элементу
FladeX
  опции профиля:
сообщение 27.3.2009, 12:18
Сообщение #1


Студент
*

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

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




Репутация:   0  


Структура xml:
<help>
    <page id="page01">
        <title>title of page01</title>
        <message>text</message>
    </page>
    ...
    <page id="page99">
        <title>title of page99</title>
        <message>text</message>
    </page>
</help>

Нужно по id найти в нем <page>, а затем получить оттуда содержимое <message>. Пытался делать например так:
    QDomElement docElem;
    docElem = doc.elementById("page01");
        QDomNodeList lstNodes(docElem.childNodes()));
        for (int n=0; n<lstNodes.count(), n++)
        {
            childElem = lstNodes.at(n)::toElement();
            if (childElem.tagName == "message")
            {
                message = childElem.text();
            }
        }

Но не получается... Как же правильно тогда?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Kagami
  опции профиля:
сообщение 8.4.2009, 21:59
Сообщение #2


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

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

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




Репутация:   9  


Посидел десять минут, но раскусил этот орешек:
Раскрывающийся текст
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);


// В результате получим pageid равное числу...
QString pageid = QString::number(currentId());
QString pageid = "page" + QString("%1").arg(1, 2, 10, QChar('0'));

//Вот нафига заводить еще один документ? Если мы уже все загрузили в doc
QDomDocument domDocument;
QDomElement root = domDocument.documentElement();

QDomElement root = doc.documentElement();
//help у нас корневой элемент и уже содержится в root. Второй раз его искать не надо
QDomElement help = root.firstChildElement("help");
//С учетом вышесказанного эта строка не правильная
QDomElement child = help.firstChildElement("page");
QDomElement child = root.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;
}


P.S. Жалко что нельзя раскрашивать код, только так :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- FladeX   Xml - обращение к дочернему элементу   27.3.2009, 12:18
- - igor_bogomolov   Начну с того, что в приведенном Вами коде очень мн...   27.3.2009, 14:22
- - FladeX   Выдает ошибку crosses initialization of ‘QDomNodeL...   27.3.2009, 14:57
- - igor_bogomolov   ??? Я так понимаю, что childElem у Вас где-то уже ...   27.3.2009, 15:16
- - FladeX   childElem ранее объявлен не был. Замена строки не ...   27.3.2009, 15:23
- - igor_bogomolov   копируем куда-нибудь проект QTDIR/examples/xml/dom...   27.3.2009, 15:47
- - Kagami   Есть решение немного по-изящнее: Раскрывающийся те...   27.3.2009, 18:15
- - igor_bogomolov   Цитата(Kagami @ 27.3.2009, 18:15) Есть ре...   27.3.2009, 23:27
|- - Kagami   Цитата(igor_bogomolov @ 27.3.2009, 23:27)...   27.3.2009, 23:33
- - Litkevich Yuriy   Цитата(Kagami @ 28.3.2009, 2:33) .text()п...   28.3.2009, 3:34
|- - Kagami   Цитата(Litkevich Yuriy @ 28.3.2009, 3:34)...   28.3.2009, 9:16
- - FladeX   Kagami, спасибо большое! Мне как раз надо чтоб...   7.4.2009, 11:15
- - igor_bogomolov   Видимо у вас в коде есть что то вроде такого swi...   7.4.2009, 11:28
- - Litkevich Yuriy   Цитата(Kagami @ 28.3.2009, 13:16) Хм.. Чт...   7.4.2009, 11:45
- - FladeX   Итак, currentId() содержит айдишник текущей страни...   7.4.2009, 13:03
- - Litkevich Yuriy   FladeX, У меня есть тестовая программа по которой ...   7.4.2009, 13:36
- - Kagami   А какая область видимости у переменной message?   7.4.2009, 14:12
- - FladeX   Только внутри функции. Используется для QMessageBo...   7.4.2009, 14:30
- - Kagami   В приведенном выше кусочке вроде ошибок не видно. ...   7.4.2009, 17:19
- - FladeX   Вот функция целиком: cppvoid ExpertSystem:...   8.4.2009, 11:59
- - Kagami   Посидел десять минут, но раскусил этот орешек: Рас...   8.4.2009, 21:59
- - FladeX   Спасибо за развернутый ответ! Теперь понятнее ...   9.4.2009, 11:46
- - Kagami   Из-за области видимости переменной. Если ее создав...   9.4.2009, 13:25
- - FladeX   Не совсем понял, какую переменную мы создаем в усл...   10.4.2009, 15:00
- - Kagami   А какие значение возвращает currentId() ?   10.4.2009, 18:25
- - FladeX   Возвращает int. Но я уже решил проблему: Вместо э...   13.4.2009, 14:15
- - Litkevich Yuriy   Цитата(FladeX @ 13.4.2009, 18:15) Отдельн...   13.4.2009, 15:14
- - Kagami   Если бы я заметил что в середине обсуждения у тебя...   13.4.2009, 18:59


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


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




RSS Текстовая версия Сейчас: 3.2.2025, 0:31