![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
FladeX |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 67 Регистрация: 20.2.2009 Пользователь №: 564 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Структура xml:
Нужно по id найти в нем <page>, а затем получить оттуда содержимое <message>. Пытался делать например так:
Но не получается... Как же правильно тогда? |
|
|
igor_bogomolov |
![]()
Сообщение
#2
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Начну с того, что в приведенном Вами коде очень много ошибок, что очень неприятно при отладке. Надо быть поокуратнее.
Цитата QDomElement QDomDocument::elementById ( const QString & elementId ) Returns the element whose ID is equal to elementId. If no element with the ID was found, this function returns a null element. Since the QDomClasses do not know which attributes are element IDs, this function returns always a null element. This may change in a future version. Т.е. насколько я понимаю, этот метод всегда вернет нулевой елемент. Я сделал так:
Данный код у меня работает. Может не самое оптимальное решение, кто знает как сделать лучше раскажите ![]() |
|
|
FladeX |
![]()
Сообщение
#3
|
Студент ![]() Группа: Участник Сообщений: 67 Регистрация: 20.2.2009 Пользователь №: 564 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Выдает ошибку
на строке
что не так? |
|
|
igor_bogomolov |
![]()
Сообщение
#4
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
???
Я так понимаю, что childElem у Вас где-то уже объявлен. Сделайте просто
И domDocument, в Вашем случае объявлен как doc Отпишитесь о результате. Если что выложу компилябильный проект. |
|
|
FladeX |
![]()
Сообщение
#5
|
Студент ![]() Группа: Участник Сообщений: 67 Регистрация: 20.2.2009 Пользователь №: 564 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
childElem ранее объявлен не был.
Замена строки не помогла, ошибка та же самая... |
|
|
igor_bogomolov |
![]()
Сообщение
#6
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
копируем куда-нибудь проект QTDIR/examples/xml/dombookmarks
В файле xbeltree.cpp ищем функцию bool XbelTree::read(QIODevice *device) Что бы не мучаться, заменяем весь ее код, на следущий: Раскрывающийся текст
Рядом с exe-шником кладем ваш файл Раскрывающийся текст
Компилируем, смотрим что выводит qDebug(); Не забываем отписаться о результатах. P.S. У меня все выше описанное прекрасно работает. |
|
|
Kagami |
![]()
Сообщение
#7
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: ![]() ![]() ![]() |
Есть решение немного по-изящнее:
Раскрывающийся текст
Перебираем только нужные элементы и не чувствительны к положению <message> - в предыдущем примере он обязан находиться в конце. |
|
|
igor_bogomolov |
![]()
Сообщение
#8
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(Kagami @ 27.3.2009, 18:15) Link Есть решение немного по-изящнее: Не буду врать, по специфике своей работы никак с xml сталкиваться не приходилось. Просто было интересно разобраться, вот и помог. Ваш же пример выдаёт не то что мы ожидаем. В топикстарте написано, что требуется вернуть данные тега "message", у Вас же получается следущее Цитата "title of page01text1" а надо Цитата "text1" Цитата(Kagami @ 27.3.2009, 18:15) Link в предыдущем примере он обязан находиться в конце. Да, я исходил из структуры файла ![]() |
|
|
Kagami |
![]()
Сообщение
#9
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(igor_bogomolov @ 27.3.2009, 23:27) Link Ваш же пример выдаёт не то что мы ожидаем. Упс, небольшая очепятка всралась ![]() Правильно так:
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#10
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(Kagami @ 28.3.2009, 2:33) Link .text() по моему опыту, лучше избегать применения этой функции, т.к. она рекурсивная, т.е. схватит все вложенные тэги, часто это неподходящий вариант. Лучше использовать data() или value().П.С. еслиб не простуда, привел бы пример, но нагретая голова плохо соображает. |
|
|
Kagami |
![]()
Сообщение
#11
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(Litkevich Yuriy @ 28.3.2009, 3:34) Link по моему опыту, лучше избегать применения этой функции, т.к. она рекурсивная, т.е. схватит все вложенные тэги, часто это неподходящий вариант. Лучше использовать data() или value(). Хм.. Что-то я сходу не нашел таких функций у QDomElement и у QDomDocument ни у их родителя QDomNode.. P.S. Выздоравливай скорее |
|
|
FladeX |
![]()
Сообщение
#12
|
Студент ![]() Группа: Участник Сообщений: 67 Регистрация: 20.2.2009 Пользователь №: 564 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Kagami, спасибо большое! Мне как раз надо чтобы от положения элемента в xml не зависел его выбор.
Но ошибка так и остается:
Что за ошибка вообще такая? |
|
|
igor_bogomolov |
![]()
Сообщение
#13
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Видимо у вас в коде есть что то вроде такого
Так делать нельзя. Определение int j нужно вынести
Сообщение отредактировал igor_bogomolov - 7.4.2009, 11:28 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#14
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(Kagami @ 28.3.2009, 13:16) Link Хм.. Что-то я сходу не нашел таких функций у QDomElement и у QDomDocument ни у их родителя QDomNode.. вот кусочки из моего кода: насчёт value() неправ, должно быть nodeValue()
|
|
|
FladeX |
![]()
Сообщение
#15
|
Студент ![]() Группа: Участник Сообщений: 67 Регистрация: 20.2.2009 Пользователь №: 564 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Итак, currentId() содержит айдишник текущей страницы. Обработка нажатия на кнопку "Помощь" (только основное):
cpp
И вот такой структуры xml файл есть: xml
Но почему-то переменная message пуста... |
|
|
Litkevich Yuriy |
![]()
Сообщение
#16
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
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 |
![]()
Сообщение
#17
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: ![]() ![]() ![]() |
А какая область видимости у переменной message?
|
|
|
FladeX |
![]()
Сообщение
#18
|
Студент ![]() Группа: Участник Сообщений: 67 Регистрация: 20.2.2009 Пользователь №: 564 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Только внутри функции. Используется для QMessageBox и все.
|
|
|
Kagami |
![]()
Сообщение
#19
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: ![]() ![]() ![]() |
В приведенном выше кусочке вроде ошибок не видно. Было бы неплохо глянуть на весь код этой процедуры
Сообщение отредактировал Kagami - 7.4.2009, 17:20 |
|
|
FladeX |
![]()
Сообщение
#20
|
Студент ![]() Группа: Участник Сообщений: 67 Регистрация: 20.2.2009 Пользователь №: 564 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Вот функция целиком:
cpp
|
|
|
Kagami |
![]()
Сообщение
#21
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: ![]() ![]() ![]() |
Посидел десять минут, но раскусил этот орешек:
Раскрывающийся текст 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; } //Второй раз устанавливать содержимое не надо // В результате получим pageid равное числу... QString pageid = "page" + QString("%1").arg(1, 2, 10, QChar('0')); //Вот нафига заводить еще один документ? Если мы уже все загрузили в doc QDomElement root = domDocument.documentElement(); QDomElement root = doc.documentElement(); //help у нас корневой элемент и уже содержится в root. Второй раз его искать не надо //С учетом вышесказанного эта строка не правильная 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 |
![]()
Сообщение
#22
|
Студент ![]() Группа: Участник Сообщений: 67 Регистрация: 20.2.2009 Пользователь №: 564 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Спасибо за развернутый ответ! Теперь понятнее стало.
Однако, погоняв эту функцию, заметил, что условие
всегда ложно. То есть если внутри этого условия задавать переменную message, то в программе ничего не будет выведено, так как этот участок кода никогда не отработает. А если задавать message вне условной конструкции, то все ок. Почему же так происходит? Может условие не совсем корректное? |
|
|
Kagami |
![]()
Сообщение
#23
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: ![]() ![]() ![]() |
Из-за области видимости переменной. Если ее создавать в условии, то в его конце она будет удалена
|
|
|
FladeX |
![]()
Сообщение
#24
|
Студент ![]() Группа: Участник Сообщений: 67 Регистрация: 20.2.2009 Пользователь №: 564 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Не совсем понял, какую переменную мы создаем в условии...
Перенес из цикла все что только можно было вынести - результат тот же (пустое модальное окно). Перенес вызов QMessageBox внутрь цикла - модальное окно вообще перестало вызываться. |
|
|
Kagami |
![]()
Сообщение
#25
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: ![]() ![]() ![]() |
А какие значение возвращает currentId() ?
|
|
|
FladeX |
![]()
Сообщение
#26
|
Студент ![]() Группа: Участник Сообщений: 67 Регистрация: 20.2.2009 Пользователь №: 564 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Возвращает int.
Но я уже решил проблему: Вместо этого:
прописал старое:
и все заработало! Отдельное спасибо Kagami за помощь ![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#27
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(FladeX @ 13.4.2009, 18:15) Link Отдельное спасибо Kagami за помощь кни ему "Спасибу"
|
|
|
Kagami |
![]()
Сообщение
#28
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: ![]() ![]() ![]() |
Если бы я заметил что в середине обсуждения у тебя поменялся xml-файл все решилось бы быстрее
![]() Сообщение отредактировал Kagami - 13.4.2009, 19:02 |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 14.8.2025, 0:52 |