crossplatform.ru

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

> Проход xml
epishev
  опции профиля:
сообщение 17.5.2011, 15:04
Сообщение #1


Студент
*

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

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




Репутация:   0  


Всем привет!
Теперь другая проблемма:

Я прохожу xml файл, ищу теги с именем scene, если нахожу, то создаю файл с именем атрибута("id") тега.
Не могу понять почему цикл
while(!domNode.isNull())
{
...
}

из ф-ции ниже, выполняется только один раз (создается только один xml) хотя элементов с именем scene более одного.

Если изменить тело условия
if(domElement.tagName() == "scene")
{...}

на
if(domElement.tagName() == "scene")
                {
                    QString bufScene = domElement.attribute("id");

                    QString str = "XMLrelease/"+bufLevel+"/";
                    QDir a;
                    a.mkdir(str);

                    //QDomDocument docXML;
                    //QDomElement b=docXML.createElement("");
                    //b=domElement;
                    //docXML.appendChild(b);

                    QFile file;

                    file.setFileName(str+bufScene+".xml");

                    if(file.open(QIODevice::WriteOnly))
                    {
                        //QTextStream(&file) << docXML.toString();
                        file.close();
                    }


...., то создаются все xml файлы (столько же, сколько элементов с именем scene), но они, естественно пустые.
Как решить эту проблему? Что я делаю не так?

код ф-ции:
void irReleaseXML::traverseNode1(const QDomNode &node,QString bufLevel)
{
    //присваиваем domNode первый элемент из XML файла
    QDomNode domNode=node.firstChild();
    while(!domNode.isNull())
    {
        QDomElement domElement = domNode.toElement();
        if(domNode.isElement())
        {
            if(!domElement.isNull())
            {
                if(domElement.tagName() == "scene")
                {
                    QString bufScene = domElement.attribute("id");

                    QString str = "XMLrelease/"+bufLevel+"/";
                    QDir a;
                    a.mkdir(str);

                    QDomDocument docXML;

                    QDomElement b=docXML.createElement("");

                    b=domElement;
                    docXML.appendChild(b);

                    QFile file;

                    file.setFileName(str+bufScene+".xml");

                    if(file.open(QIODevice::WriteOnly))
                    {
                        QTextStream(&file) << docXML.toString();
                        file.close();
                    }
                }
            }
        }
        domNode = domNode.nextSibling();
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 9)
Rocky
  опции профиля:
сообщение 17.5.2011, 15:14
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

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




Репутация:   7  


Ну как бы
QDomElement b=docXML.createElement("");
b=domElement;
docXML.appendChild(b);
        ...............
{
       QTextStream(&file) << docXML.toString();


А почему он должен быть _не_ пустой при таком коде?

ЗЫ. Вообще то что-то очень хитрое делаете..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
epishev
  опции профиля:
сообщение 17.5.2011, 15:31
Сообщение #3


Студент
*

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

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




Репутация:   0  


Цитата(Rocky @ 17.5.2011, 16:14) *
Ну как бы
QDomElement b=docXML.createElement("");
b=domElement;
docXML.appendChild(b);
        ...............
{
       QTextStream(&file) << docXML.toString();


А почему он должен быть _не_ пустой при таком коде?

ЗЫ. Вообще то что-то очень хитрое делаете..



при таком коде файл записывается (т.е. НЕ _не_ пустой), но создается только один файл... завершается цикл, хотя по идее должен продолжить работу...


Цитата(Rocky @ 17.5.2011, 16:14) *
ЗЫ. Вообще то что-то очень хитрое делаете..


Есть xml файл, нужно создать новый xml для каждого элемента с именем scene,
и записать этот элемент в свой файл.

Переформулирую вопрос

Чем мешает этот код
QDomDocument docXML;
QDomElement b=docXML.createElement("");
b=domElement;
docXML.appendChild(b);


продолжению работы цыкла

while(!domNode.isNull())
{
...
}


?????
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FantasyOr
  опции профиля:
сообщение 17.5.2011, 15:32
Сообщение #4


Студент
*

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

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




Репутация:   0  


делаю вот так:
#define NodeName "NodeName"
...
...
QDomElement root = DomDocument.documentElement();

QDomElement child = root.firstChildElement(NodeName);
while (!child.isNull())
{
  // действия с child

        child = child.nextSiblingElement(NodeName);
}


тут я прохожу по всем нодам с определенным именем в Вашем случае "scene".


могу ошибаться, но
domNode = domNode.nextSibling();

нужно ставить не в if, а за ним, ибо тогда есть вероятность, что
if(domNode.isElement())

будет false и курсор не сдвинется на след нод => domNode не изменится.


Сообщение отредактировал FantasyOr - 17.5.2011, 15:38
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
epishev
  опции профиля:
сообщение 17.5.2011, 15:44
Сообщение #5


Студент
*

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

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




Репутация:   0  


Цитата(FantasyOr @ 17.5.2011, 16:32) *
делаю вот так:
#define NodeName "NodeName"
...
...
QDomElement root = DomDocument.documentElement();

QDomElement child = root.firstChildElement(NodeName);
while (!child.isNull())
{
  // действия с child

        child = child.nextSiblingElement(NodeName);
}


тут я прохожу по всем нодам с определенным именем в Вашем случае "scene".


могу ошибаться, но
domNode = domNode.nextSibling();

нужно ставить не в if, а за ним, ибо тогда есть вероятность, что
if(domNode.isElement())

будет false и курсор не сдвинется на след нод => domNode не изменится.


переписал, ничего не изменилось... =( также проходит цикл только один раз.....

domNode = domNode.nextSibling();

у меня стоит после
if(domNode.isElement())
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FantasyOr
  опции профиля:
сообщение 18.5.2011, 10:21
Сообщение #6


Студент
*

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

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




Репутация:   0  


у Вас должно получиттся:
#define NodeName "scene"


irReleaseXML::traverseNode1(const QDomNode &node, QString bufLevel)
{
    QDomElement child = node.firstChildElement(NodeName);
    while (!child.isNull())
    {
        QString bufScene = child.attribute("id");
        QString str = "XMLrelease/"+bufLevel+"/";

        QDir a;
        a.mkdir(str);

        QDomDocument docXML;
        QDomElement b = docXML.createElement("");

        docXML.appendChild(b);

        QFile file(str+bufScene+".xml");

        if(file.open(QIODevice::WriteOnly))
        {
            QTextStream out(&file);
            out << docXML.toString() << endl;
            file.close();
        }

        child = child.nextSiblingElement(NodeName);
    }
}


Сообщение отредактировал FantasyOr - 18.5.2011, 11:31
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
epishev
  опции профиля:
сообщение 19.5.2011, 9:00
Сообщение #7


Студент
*

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

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




Репутация:   0  


Цитата(FantasyOr @ 18.5.2011, 11:21) *
у Вас должно получиттся:
...


Взял вашу ф-цию, только после
QDomDocument docXML;
QDomElement b = docXML.createElement("");


добавил
b=child;


всеравно, создает только один xml

////////////////////////////////////////////////////
изменил
QDomDocument docXML;
QDomElement b = docXML.createElement("");
b=child;
docXML.appendChild(b);


на

QDomDocument docXML;
//QDomElement b = docXML.createElement("");
//b=child;
docXML.appendChild(child);


в результате создает все файлы, только они пустые, точнее в них по две пустые строки

Как мне засунуть каждый новый элемент child в новый файл?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FantasyOr
  опции профиля:
сообщение 19.5.2011, 11:44
Сообщение #8


Студент
*

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

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




Репутация:   0  


QUOTE (epishev @ 19.5.2011, 10:00) *
docXML.createElement("");


а почему Вы уверены, что он должен быть не пустой?

к сожалению не приходилось писать в XML, только читать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
epishev
  опции профиля:
сообщение 19.5.2011, 13:18
Сообщение #9


Студент
*

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

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




Репутация:   0  


Цитата(FantasyOr @ 19.5.2011, 12:44) *
Цитата(epishev @ 19.5.2011, 10:00) *
docXML.createElement("");


а почему Вы уверены, что он должен быть не пустой?

к сожалению не приходилось писать в XML, только читать.



QDomDocument docXML;
QDomElement b = docXML.createElement("");
b=child;
docXML.appendChild(b);


я это делаю для того, чтобы привязать элемент child к docXML (подругому незнаю как)
При таком варианте xml какрас не пустой... просто цикл проходит только один раз (создается только один xml, даже если в исходном файле элементов scene более 2х)

если же написать
QDomDocument docXML;
docXML.appendChild(child);


,то получаемый xml файл пустой...........





Короче устал я голову ломать....

сделал через ж..., на мой взгляд,.....

Прошел по всем объектам элемента scene и создал новый элемент из данных взятых в исходном xml

Всем спасибо!

PS если кто знает почему цикл проходит только один раз, то сменя спасибо! за разъяснения =)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.5.2011, 14:04
Сообщение #10


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

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

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




Репутация:   94  


Цитата(epishev @ 19.5.2011, 16:18) *
QDomElement b = docXML.createElement("");
b=child;
а в чём смысл первой строчки?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 28.3.2024, 22:33