Автор: 31512 20.3.2008, 22:49
Здравствуйте, Уважаемые! Столкнулся с проблемой записи некоторого значения в узел 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
А что у тебя происходит в других классах?
Просто что происходит в:
CPropertyNode* Property = new CPropertyNode(this, ValueCount);
Property->ProcessByNode(NewProperty);
Properties.append(Property);
мы можем только догадываться.
Если не жалко выложи проект (в качестве аттача), или отдельный тестовый проект, повторяющий ошибку.
Я потом могу его удалить.
p.s. незабудь указать какая версия Qt.
Автор: 31512 22.3.2008, 14:51
Цитата(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>
Автор: 31512 22.3.2008, 17:42
Проблему удалось решить
http://doc.trolltech.com/4.3/qdomtext.html
Это лишнее подтверждение тому, что не только в России делают некоторые вещи через одно место.
Вместо
CODE
FIRST.setNodeValue("AAA");
нужно писать
CODE
QDomText domText = Doc.createTextNode("AAA");
FIRST.appendChild(domText);