Russian Qt Forum
Сентябрь 21, 2024, 11:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Text элемента родителя содержит в себе текст всей дочерней ветки...  (Прочитано 4406 раз)
BeSeech
Гость
« : Апрель 27, 2009, 22:43 »

Доброго времени суток.

с Qt я еще не дружу а только знакомлюсь. Так что натыкаюсь на вроди как банальные вещи.
В основном проблему решить удается самостоятельно полистав форумы/книги. А тут не выходит.
Помогите люди добрые, мы сами не местные (с)

Суть вот в чем. Задача прочитать из файла XML данные с неограниченным уровнем вложений
и записать это все в QStandardItemModel после чего отобразить это хозяйство в виде QTreeView.

Перебирать все узлы QDomDocument с горем пополам удается. Дальше надо получить
текст элемента и занести его в модель. Проблема в том, что, к примеру:
Элемент "ааа"
Подэлемент "ббб"
Так вот. Текст элемента оно мне возвращает как "аааббб"....

Ниже структура тестового XML и две функции в которых реализовано чтение.
Рекурсивная часть
Код:
void MMenu::oneWay2(QStandardItem* pParent, QDomNode* pParentNode)
{

    pitem = pParent;
    for (int ind = 0; ind < pParentNode->childNodes().count(); ind++)
    {
        if (pParentNode->childNodes().item(ind).isElement())
        {
            pitem->appendRow(new QStandardItem);
            pitem->child(ind-1,0)->setText(pParentNode->childNodes().item(ind).toElement().text());
            if (pParentNode->childNodes().item(ind).childNodes().count()>1)
            {
                oneWay2(pitem->child(ind-1,0), &pParentNode->childNodes().item(ind));
            }
        }
    }

}

Начало заполнения модели
Код:
void MMenu::xmlToModel(QStandardItemModel* pModel, QString appPath)
{
    QDomDocument* pdomDoc;

    QFile file(appPath+"/bePhoneBook.xml");

    pdomDoc = new QDomDocument("bePhoneBook");

    if (file.exists())
    {
        file.open(QIODevice::ReadOnly);
        pdomDoc->setContent(&file);
        file.close();
    }

    QDomNode n = pdomDoc->firstChild();
    QModelIndex index;

    n = n.firstChild();
    pModel->clear();

    while (!n.isNull())
    {
        pModel->appendRow(new QStandardItem);
        index = pModel->index(pModel->rowCount()-1, 0);
        pModel->setData(index, ""+n.toElement().text());

        if ((n.hasChildNodes()) && (n.childNodes().count()>1))
        {
            oneWay2(pModel->itemFromIndex(index), &n);
        }

        n = n.nextSibling();
    }
   
    ptreeView->selectionModel()->setCurrentIndex(pModel->index(0, 0), QItemSelectionModel::ClearAndSelect);

    delete pdomDoc;

}

Сам XML
Код:
<!DOCTYPE bePhoneBook>
<bePhoneBook>
 <name>a<info>11<info>111</info>
   <info>112<info>1121</info>
   </info>
  </info>
  <info>12<info>121</info>
  </info>
 </name>
 <name>135</name>
 <name>728</name>
 <name>811</name>
 <name>Windows-1251</name>
 <name>C:/Users/BeSeech/alex/Wall Paper</name>
</bePhoneBook>


В итоге первый элемент выходит с текстом "a11111112112112121" вместо "а".
Что я делаю не так?
Спасбио за помощь  Улыбающийся
« Последнее редактирование: Апрель 27, 2009, 22:48 от BeSeech » Записан
mugabe
Гость
« Ответ #1 : Апрель 29, 2009, 16:11 »

Это вовсе не проблема Qt. В любом языке и любой реализации DOM .text возвращает (по крайней мере должен) именно это.
Что бы получить текст исключительно необходимого Node нужно обойти все его child'ы, проверить какие из них являются текстом (должно быть что-то вроде .isText()) и уже у этих элементов получать значение.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #2 : Апрель 29, 2009, 17:46 »

BeSeech, в Асисстенте чётко написано, что функция text() рекурсивная. (см. описание QDomElement)
Записан

Юра.
BeSeech
Гость
« Ответ #3 : Апрель 30, 2009, 18:09 »

Спасибо. Понял свою ошибку.
Уже подправил - работает.  Улыбающийся

p.s. Простите за этот глупый вопрос, но я так полагаю, их еще будет у меня.  Обеспокоенный
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 22.