Russian Qt Forum

Qt => XML => Тема начата: BeSeech от Апрель 27, 2009, 22:43



Название: Text элемента родителя содержит в себе текст всей дочерней ветки...
Отправлено: 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" вместо "а".
Что я делаю не так?
Спасбио за помощь  :)


Название: Re: Text элемента родителя содержит в себе текст всей дочерней ветки...
Отправлено: mugabe от Апрель 29, 2009, 16:11
Это вовсе не проблема Qt. В любом языке и любой реализации DOM .text возвращает (по крайней мере должен) именно это.
Что бы получить текст исключительно необходимого Node нужно обойти все его child'ы, проверить какие из них являются текстом (должно быть что-то вроде .isText()) и уже у этих элементов получать значение.


Название: Re: Text элемента родителя содержит в себе текст всей дочерней ветки...
Отправлено: lit-uriy от Апрель 29, 2009, 17:46
BeSeech, в Асисстенте чётко написано, что функция text() рекурсивная. (см. описание QDomElement (http://doc.crossplatform.ru/qt/4.4.3/qdomelement.html))


Название: Re: Text элемента родителя содержит в себе текст всей дочерней ветки...
Отправлено: BeSeech от Апрель 30, 2009, 18:09
Спасибо. Понял свою ошибку.
Уже подправил - работает.  :)

p.s. Простите за этот глупый вопрос, но я так полагаю, их еще будет у меня.  :-[