crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> DOM-парсинг: запись в QDomElement
void*
  опции профиля:
сообщение 16.1.2009, 18:24
Сообщение #1


Программист-самоучка
***

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

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




Репутация:   3  


каким образом можно поменять текст внутри тега, например есть тег:
<sometag>sometext</sometag>
и я хочу поменять строку sometext на другую (допустим sometext2). Как это возможно сделать?
с аттрибутами то все просто, есть QDomElement::setAttribute(), есть также QDomElement::attribute(), а вот для текста внутри тега есть только QDomElement::text(), но он только возвращает значение. Как быть?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.1.2009, 18:40
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9687
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(void* @ 16.1.2009, 21:24) *
QDomElement::text(),
этим добром лучше не пользуйся, эта функция рекурсивно по ветке бегает, используй data

void QDomCharacterData::setData ( const QString & v )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 16.1.2009, 19:47
Сообщение #3


Программист-самоучка
***

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

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




Репутация:   3  


пасиб, попробую
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 16.1.2009, 21:58
Сообщение #4


Программист-самоучка
***

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

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




Репутация:   3  


блин или я туплю или все равно ничего не записывает. Вот полностью функция:
полный код функции
тут был код :)


Сообщение отредактировал void* - 17.1.2009, 15:42
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.1.2009, 5:21
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9687
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


приведу клочёк своего кода:
Раскрывающийся текст
/*
* Автопортрет узла
*/
void XmlStalker::SelfPortrait(const QDomNode &n, int rid, int id)
{
  QDomNamedNodeMap atrmap;
  QDomElement    e;
  QDomText        t;
  QDomAttr        a;
  QDomNode        ln;
  QString        tag;  
  QString        text;
  QString        data;
  QString        value;
  QString        name;
  QString        type;
  int            atrcnt;

    
    switch (n.nodeType())
    {
        case (QDomNode::ElementNode):
        {
            type="ElementNode";
            break;
        }
        case (QDomNode::AttributeNode):
            type="AttributeNode";
            break;
        case (QDomNode::TextNode):
            type="TextNode";
            break;
        case (QDomNode::CDATASectionNode):
            type="CDATASectionNode";
            break;
        case (QDomNode::EntityReferenceNode):
            type="EntityReferenceNode";
            break;
        case (QDomNode::EntityNode):
            type="EntityNode";
            break;
        case (QDomNode::ProcessingInstructionNode):
            type="ProcessingInstructionNode";
            break;
        case (QDomNode::CommentNode):
            type="CommentNode";
            break;
        case (QDomNode::DocumentNode):
            type="DocumentNode";
            break;
        case (QDomNode::DocumentFragmentNode):
            type="DocumentFragmentNode";
            break;
        case (QDomNode::NotationNode):
            type="NotationNode";
            break;
        case (QDomNode::BaseNode):
            type="BaseNode";
            break;
        case (QDomNode::CharacterDataNode):
            type="CharacterDataNode";
            break;
        default:
            type="ERROR_TYPE";
            break;
    }
    
    name= n.nodeName().simplified();
    value= n.nodeValue().simplified();
    
    t = n.toText();
    data = t.data().simplified();
    

    
    e = n.toElement();
    tag = e.tagName().simplified();
    text= e.text().simplified();
    atrmap = e.attributes();
    atrcnt = atrmap.size();
    
    

    uout << "Addr: " << rid << ", " << id << endl;
    uout << "Type: " << type << endl;
    uout << "TagName: " << tag << endl;
    uout << "Name: " << name << endl;
    uout << "Value: " << value << endl;
    uout << "Data: " << data << endl;
    uout << "Text: " << text << endl;
    
    if (atrcnt)
    {
        int    cnt;
        QString        aname;
        QString        avalue;
        
        cnt=0;
        while (cnt<atrcnt)
        {
            ln = atrmap.item(cnt++);
            a = ln.toAttr();
            aname = a.name().simplified();
            avalue = a.value().simplified();
            uout << "Atr: " << aname << "= " << avalue << endl;    
        }
    }
    
    if(n.hasChildNodes())
    {
        
        uout << "I have a " << n.childNodes().size() << " children" << endl;
    }
    else
    {
        uout << "I havn't a children" << endl;
    }
    uout << "-------------------------------------------------" << endl;

}



тут смотри:
t = n.toText();
...
data = t.data().simplified();
...
uout << "Data: " << data << endl;


я до этой штуки долго доходил, и логики вроде минимум, но работает железно

Если надо могу дать весь исходник, он гуляет по XML-дереву и выводит в консоль автопортрет узла в котором в данный момент находится:
вывод в консоль/файл
-------------------------------------------------
Addr: 6, 7
Type: ElementNode
Name: seg
Value:
Data:
Text: - lightweight, but can be a three-paragraph explanation.
I have a 1 children
-------------------------------------------------
Addr: 7, 8
Type: TextNode
Name: #text
Value: - lightweight, but can be a three-paragraph explanation.
Data: - lightweight, but can be a three-paragraph explanation.
Text:
I havn't a children
-------------------------------------------------
Addr: 5, 9
Type: ElementNode
Name: tuv
Value:
Data:
Text: - легкий, но может быть объяснение с тремя параграфами.
Atr: lang= RU-RU
I have a 1 children
-------------------------------------------------
Здесь Addr: 5, 9 - "адрес" узла координаты типа (№ родителя, № меня)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 17.1.2009, 11:53
Сообщение #6


Программист-самоучка
***

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

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




Репутация:   3  


т.е. насколько я понял, в моем случае нужно делать примерно так:
QDomNode node;
QDomText text;
...
//перемещаю node на нужный мне тег
...
t = node.toText();
t.setData(str); //str - произвольная строка

правильно?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.1.2009, 12:58
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9687
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(void* @ 17.1.2009, 14:53) *
правильно?
думаю да.
Я только изучал как читаются данные, что и в каких классах хранится. А вот писать еще не пробывал :wink2:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 17.1.2009, 15:40
Сообщение #8


Программист-самоучка
***

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

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




Репутация:   3  


Litkevich Yuriy, так тоже не работает.
С чтением то у меня тоже проблем нет, а вот с записью тут несколько сложнее...

походу проблема решена. Есть два способа решения моей проблемы в зависимости от ситуации:
1) когда тег уже имеет какой-либо текст:
QDomElement root = xmlDocument.documentElement();
root.firstChildElement("sometag").firstChild().setNodeValue("sometext2");

т.е. firstChild() в этом случае вернет QDomNode, который по сути именно текст внутри тега

2) когда тег пустой, т.е. что-то вроде <sometag/>, то firstChild() возвратит NULL, надо тогда действовать таким образом:
 QDomDocument myDoc;
  element= myDoc->documentElement()->firstChildElement("sometag");
  QDomText myTextNode = myDoc.createTextNode("sometext2");
  element.appendChild(myTextNode);

вобщем вот так вот как-то некрасиво получается...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.1.2009, 16:13
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9687
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


offtop:
Вообще мне этот DOM не понравился, на больших файлах тормозит дико. Сильно запутаный - работать сложно. А альтернативы, в режиме чтение-запись, в Qt'ях похоже нету.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 17.1.2009, 18:54
Сообщение #10


Программист-самоучка
***

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

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




Репутация:   3  


SAX? :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 29.3.2017, 2:21