Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: DOM-парсинг: запись в QDomElement
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Обработка XML
void*
каким образом можно поменять текст внутри тега, например есть тег:
<sometag>sometext</sometag>
и я хочу поменять строку sometext на другую (допустим sometext2). Как это возможно сделать?
с аттрибутами то все просто, есть QDomElement::setAttribute(), есть также QDomElement::attribute(), а вот для текста внутри тега есть только QDomElement::text(), но он только возвращает значение. Как быть?
Litkevich Yuriy
Цитата(void* @ 16.1.2009, 21:24) *
QDomElement::text(),
этим добром лучше не пользуйся, эта функция рекурсивно по ветке бегает, используй data

void QDomCharacterData::setData ( const QString & v )
void*
пасиб, попробую
void*
блин или я туплю или все равно ничего не записывает. Вот полностью функция:
полный код функции
тут был код :)
Litkevich Yuriy
приведу клочёк своего кода:
Раскрывающийся текст
/*
* Автопортрет узла
*/
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*
т.е. насколько я понял, в моем случае нужно делать примерно так:
QDomNode node;
QDomText text;
...
//перемещаю node на нужный мне тег
...
t = node.toText();
t.setData(str); //str - произвольная строка

правильно?
Litkevich Yuriy
Цитата(void* @ 17.1.2009, 14:53) *
правильно?
думаю да.
Я только изучал как читаются данные, что и в каких классах хранится. А вот писать еще не пробывал :wink2:
void*
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
offtop:
Вообще мне этот DOM не понравился, на больших файлах тормозит дико. Сильно запутаный - работать сложно. А альтернативы, в режиме чтение-запись, в Qt'ях похоже нету.
void*
SAX? :)
Litkevich Yuriy
Цитата(void* @ 17.1.2009, 21:54) *
SAX?
А он вроде только для чтения.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.