XML - запись значения узла, XML - запись значения узла |
Здравствуйте, гость ( Вход | Регистрация )
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
|
Администратор Группа: Администратор Сообщений: 646 Регистрация: 9.10.2007 Из: crossplatform.ru Пользователь №: 1 Спасибо сказали: 17 раз(а) Репутация: 2 |
А что у тебя происходит в других классах?
Просто что происходит в: мы можем только догадываться.Если не жалко выложи проект (в качестве аттача), или отдельный тестовый проект, повторяющий ошибку. Я потом могу его удалить. p.s. незабудь указать какая версия Qt. |
|
|
31512 |
22.3.2008, 14:51
Сообщение
#3
|
Студент Группа: Новичок Сообщений: 26 Регистрация: 13.3.2008 Из: Красноярск Пользователь №: 119 Спасибо сказали: 0 раз(а) Репутация: 0 |
А что у тебя происходит в других классах? Просто что происходит в: мы можем только догадываться.Если не жалко выложи проект (в качестве аттача), или отдельный тестовый проект, повторяющий ошибку. Я потом могу его удалить. 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
Сообщение
#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); |
|
|
Текстовая версия | Сейчас: 29.11.2024, 22:43 |