crossplatform.ru

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


  Ответ в DOM-парсинг: запись в QDomElement
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 17.1.2009, 19:21
 
Цитата(void* @ 17.1.2009, 21:54) *
SAX?
А он вроде только для чтения.
void* Дата 17.1.2009, 18:54
  SAX? :)
Litkevich Yuriy Дата 17.1.2009, 16:13
  offtop:
Вообще мне этот DOM не понравился, на больших файлах тормозит дико. Сильно запутаный - работать сложно. А альтернативы, в режиме чтение-запись, в Qt'ях похоже нету.
void* Дата 17.1.2009, 15:40
  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, 12:58
 
Цитата(void* @ 17.1.2009, 14:53) *
правильно?
думаю да.
Я только изучал как читаются данные, что и в каких классах хранится. А вот писать еще не пробывал :wink2:
void* Дата 17.1.2009, 11:53
  т.е. насколько я понял, в моем случае нужно делать примерно так:
QDomNode node;
QDomText text;
...
//перемещаю node на нужный мне тег
...
t = node.toText();
t.setData(str); //str - произвольная строка

правильно?
Litkevich Yuriy Дата 17.1.2009, 5:21
  приведу клочёк своего кода:
Раскрывающийся текст
/*
 * Автопортрет узла
 */
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* Дата 16.1.2009, 21:58
  блин или я туплю или все равно ничего не записывает. Вот полностью функция:
полный код функции
тут был код :)
void* Дата 16.1.2009, 19:47
  пасиб, попробую
Litkevich Yuriy Дата 16.1.2009, 18:40
 
Цитата(void* @ 16.1.2009, 21:24) *
QDomElement::text(),
этим добром лучше не пользуйся, эта функция рекурсивно по ветке бегает, используй data

void QDomCharacterData::setData ( const QString & v )
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 10.7.2025, 17:35