crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> XML - запись значения узла, XML - запись значения узла
31512
  опции профиля:
сообщение 20.3.2008, 22:49
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 26
Регистрация: 13.3.2008
Из: Красноярск
Пользователь №: 119

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




Репутация:   0  


Здравствуйте, Уважаемые! Столкнулся с проблемой записи некоторого значения в узел XML.
Вот XML исходный:
CODE

<SEPARATOR PORT="3333" IP="192.168.34.21" NAME="separator" COLOR="1234567" >
<PROPERTIES>
</PROPERTIES>
</SEPARATOR>


Таким ожидается получить его получить после добавления дочерних узлов в <PROPERTIES>:
CODE
<SEPARATOR PORT="3333" IP="192.168.34.21" NAME="separator" COLOR="1234567" >
<PROPERTIES>
<PROPERTY CODE="TEST_PROP1" >
<VALUE>AAA</VALUE>
</PROPERTY>
<PROPERTY CODE="TEST_PROP2" >
<VALUE>AAA</VALUE>
<VALUE>AAA</VALUE>
</PROPERTY>
<PROPERTY CODE="TEST_PROP3" >
<VALUE>AAA</VALUE>
<VALUE>AAA</VALUE>
<VALUE>AAA</VALUE>
</PROPERTY>
</PROPERTIES>
</SEPARATOR>


А таким он получается:
CODE
<SEPARATOR PORT="3333" IP="192.168.34.21" NAME="separator" COLOR="1234567" >
<PROPERTIES>
<PROPERTY CODE="TEST_PROP1" >
<VALUE/>
</PROPERTY>
<PROPERTY CODE="TEST_PROP2" >
<VALUE/>
<VALUE/>
</PROPERTY>
<PROPERTY CODE="TEST_PROP3" >
<VALUE/>
<VALUE/>
<VALUE/>
</PROPERTY>
</PROPERTIES>
</SEPARATOR>


Код добавления узлов:
CODE
CPropertyNode* CSeparatorNode::CreateNewProperty(QString CODE, int ValueCount)
{
QDomElement PropertiesNode = GetNode().firstChildElement("PROPERTIES");
QDomElement NewProperty = GetNode().ownerDocument().createElement("PROPERTY");
PropertiesNode.appendChild(NewProperty);
NewProperty.setAttribute("CODE", CODE);
if (ValueCount > 0)
{
for(int i=0; i<ValueCount; i++)
{
QDomElement ValueNode = GetNode().ownerDocument().createElement("VALUE");
NewProperty.appendChild(ValueNode);
ValueNode.setNodeValue("AAA");
QString S = "Значение свойства установилось в " + ValueNode.nodeValue();
qDebug(S.toAscii());//Здесь всё в порядке, выдаёт "AAA"
}
}
CPropertyNode* Property = new CPropertyNode(this, ValueCount);
Property->ProcessByNode(NewProperty);
Properties.append(Property);
return Property;
}


Код работает отлично. Узлы создаются. В консоли видно, что установилось желаемое значение узла <VALUE>. Однако после сохранения значения узлов <VALUE> пустые!
Кто-нибудь сталкивался с такой проблемой?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Admin
  опции профиля:
сообщение 22.3.2008, 9:55
Сообщение #2


Администратор
****

Группа: Администратор
Сообщений: 644
Регистрация: 9.10.2007
Из: crossplatform.ru
Пользователь №: 1

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




Репутация:   2  


А что у тебя происходит в других классах?
Просто что происходит в:
CPropertyNode* Property = new CPropertyNode(this, ValueCount);  
Property->ProcessByNode(NewProperty);  
Properties.append(Property);
мы можем только догадываться.
Если не жалко выложи проект (в качестве аттача), или отдельный тестовый проект, повторяющий ошибку.

Я потом могу его удалить.

p.s. незабудь указать какая версия Qt. ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
31512
  опции профиля:
сообщение 22.3.2008, 14:51
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 26
Регистрация: 13.3.2008
Из: Красноярск
Пользователь №: 119

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




Репутация:   0  


Цитата(Admin @ 22.3.2008, 13:55) *
А что у тебя происходит в других классах?
Просто что происходит в:
CPropertyNode* Property = new CPropertyNode(this, ValueCount);  
Property->ProcessByNode(NewProperty);  
Properties.append(Property);
мы можем только догадываться.
Если не жалко выложи проект (в качестве аттача), или отдельный тестовый проект, повторяющий ошибку.

Я потом могу его удалить.

p.s. незабудь указать какая версия Qt. ;)


Нет проблем. Описываю отдельный тест. Исследования я не прекращал. Сразу скажу, что этот проект целиком повторяет проблему.
Итак, исходный XML
CODE

<?xml version='1.0' encoding='UTF-8'?>
<CONFIG>
</CONFIG>


Ожидается после выполнения программы:

CODE
<?xml version='1.0' encoding='UTF-8'?>
<CONFIG>
<FIRST>AAA</FIRST>
</CONFIG>


Программа:

CODE

#include <QCoreApplication>
#include <QtXml/QtXml>

int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
QFile File;
QDomDocument Doc;
File.setFileName("test.xml");
if (File.open(QFile::ReadOnly))
{
int Line, Column;
QString errorMessage;
if (Doc.setContent(&File, &errorMessage, &Line, &Column))
{
File.close();
QDomElement MAIN = Doc.documentElement();
QDomElement FIRST = Doc.createElement("FIRST");
FIRST.setNodeValue("AAA");
QString message = "value is " + FIRST.nodeValue().toAscii();
qDebug(message.toAscii());// ту всё хорошо, пишется "value is AAA"
MAIN.appendChild(FIRST);
qDebug(Doc.toString(4).toAscii());
File.setFileName("test.xml");
if (File.open(QFile::WriteOnly))
{
QTextStream out(&File);
Doc.save(out, 2, QDomNode::EncodingFromDocument);
}

}
else
{
QString message = "error: " + errorMessage + " line %d" + " column %d";
qDebug(message.toAscii(), Line, Column);
}
}
return 0;
}


Результат выполнения:

CODE
<?xml version='1.0' encoding='UTF-8'?>
<CONFIG>
<FIRST/>
</CONFIG>


В программе есть qDebug(Doc.toString(4).toAscii()); Оно выводит

CODE
<?xml version='1.0' encoding='UTF-8'?>
<CONFIG>
<FIRST/>
</CONFIG>


Использую qt 4:

[Andrei@LinuxF8 ~]$ yum info qt4
Installed Packages
Name : qt4
Arch : x86_64
Version: 4.3.3
Release: 1.fc8
Size : 6.0 M
Repo : installed
Summary: Qt toolkit
Description:
Qt is a software toolkit for developing applications.

This package contains base tools, like string, xml, and network
handling.


Name : qt4
Arch : i386
Version: 4.3.3
Release: 1.fc8
Size : 5.9 M
Repo : installed
Summary: Qt toolkit
Description:
Qt is a software toolkit for developing applications.

This package contains base tools, like string, xml, and network
handling.

в
CODE
CPropertyNode* Property = new CPropertyNode(this, ValueCount);
Property->ProcessByNode(NewProperty);
Properties.append(Property);


Не происходит ничего кроме чтения и анализа содержимого узла <PROPERTY>
Прикрепленные файлы
Прикрепленный файл  SeparatorConfig_0.1.tar.gz ( 43.56 килобайт ) Кол-во скачиваний: 95
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
31512
  опции профиля:
сообщение 22.3.2008, 17:42
Сообщение #4


Студент
*

Группа: Новичок
Сообщений: 26
Регистрация: 13.3.2008
Из: Красноярск
Пользователь №: 119

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




Репутация:   0  


Проблему удалось решить
http://doc.trolltech.com/4.3/qdomtext.html

Это лишнее подтверждение тому, что не только в России делают некоторые вещи через одно место.
Вместо
CODE
FIRST.setNodeValue("AAA");

нужно писать
CODE

QDomText domText = Doc.createTextNode("AAA");
FIRST.appendChild(domText);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 24.2.2019, 7:53