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();
            }
        }

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


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

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

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




Репутация:   29  


копируем куда-нибудь проект QTDIR/examples/xml/dombookmarks
В файле xbeltree.cpp ищем функцию bool XbelTree::read(QIODevice *device)
Что бы не мучаться, заменяем весь ее код, на следущий:
Раскрывающийся текст
bool XbelTree::read(QIODevice *device)
{
    QString errorStr;
    int errorLine;
    int errorColumn;

    if (!domDocument.setContent(device, true, &errorStr, &errorLine,
                                &errorColumn)) {
        QMessageBox::information(window(), tr("DOM Bookmarks"),
                                 tr("Parse error at line %1, column %2:\n%3")
                                 .arg(errorLine)
                                 .arg(errorColumn)
                                 .arg(errorStr));
        return false;
    }

    QDomElement docElem;
    QDomNodeList lstNodes(domDocument.elementsByTagName("page"));
        for (int n=0; n<lstNodes.count(); n++)
        {
            QDomElement childElem = lstNodes.at(n).toElement();
            if (childElem.attribute("id") == "page01")
            {
                QDomElement child = childElem.lastChild().toElement();
                qDebug() << child.text();
            }
        }

    return true;
}



Рядом с exe-шником кладем ваш файл
Раскрывающийся текст
<?xml version="1.0" encoding="UTF-8"?>
<help>
    <page id = "page01">
        <title>title of page01</title>
        <message>text1</message>
    </page>
    <page id = "page99">
        <title>title of page99</title>
        <message>text2</message>
    </page>
</help>


Компилируем, смотрим что выводит qDebug();
Не забываем отписаться о результатах.

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


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


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




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