Здравствуйте, California!
К сожалению, Вы не указали ни операционную систему, ни среду разработки, с помощью которых Вы намерены производить чтение / запись Xml-документа. Разберём это на примере чтения / записи с использованием
DOM-дерева. Код кроссплатформенный, использует модуль XML библиотеки
Qt 4.x, т.е. будет работать одинаково под Linux, Windows, MacOS и большинством коммерческих версий Unix. В проекте следует добавить QT += xml
В примере вначале произведём запись приведённой Вами структуры в файл с помощью функции WriteXml (принимает в качестве параметра название файла), а затем произведём синтаксический разбор документа с помощью функции ReadXml. Исходный текст в приложении постарался подробно закомментировать.
Удачи!
Приложение:
//---------------------------------------------------------
#include <iostream> // Стандартный ввод-вывод
using namespace std;
//---------------------------------------------------------
#include <QDomDocument>
#include <QDomElement>
#include <QDomNode> // Доступ к элементам дерева DOM
#include <QFile> // Работа с файлом
#include <QTextStream> // Работа с текстовым потоком
//---------------------------------------------------------
void WriteXml(QString sFileName)
{
QDomDocument ObjectDocument; // Xml-документ
QDomElement Root = ObjectDocument.createElement("object"); // "Корень" документа (тег object)
Root.setAttribute("numb", "12345"); // Устанавливаем его атрибут и значение атрибута
QDomElement Par1Element = ObjectDocument.createElement("par1"); // Создаём параметр 1...
QDomText Par1Text = ObjectDocument.createTextNode("par10"); // ...и текст параметра.
QDomElement Par2Element = ObjectDocument.createElement("par2"); // И т.д.
QDomText Par2Text = ObjectDocument.createTextNode("par20");
QDomElement Par3Element = ObjectDocument.createElement("par3");
QDomText Par3Text = ObjectDocument.createTextNode("par30");
ObjectDocument.appendChild(Root); // Устанавливаем "корень" xml-документа
Root.appendChild(Par1Element); // Устанавливаем его параметры
Root.appendChild(Par2Element);
Root.appendChild(Par3Element);
Par1Element.appendChild(Par1Text); // Пишем в них текст
Par2Element.appendChild(Par2Text);
Par3Element.appendChild(Par3Text);
QFile InputFile(sFileName);
if(InputFile.open(QIODevice::WriteOnly)) // Если удалось открыть файл...
{
QTextStream TextStream(&InputFile);
// Создаём инструкции по обработке xml-документа
QDomNode ProcessingElement = ObjectDocument.createProcessingInstruction("xml", "version="1.0" encoding="utf-8"");
// и записываем их перед первым тегом документа
ObjectDocument.insertBefore(ProcessingElement, ObjectDocument.firstChild());
// Записываем документ в файл (передаём в поток записи).
ObjectDocument.save(TextStream, 4);
InputFile.close(); // Закрываем файл.
}
}
//---------------------------------------------------------
void ReadXml(QString sFileName)
{
QString sValue; // Строка для хранения значения атрибута узла object
QString sPar[3]; // Строки для хранения текста параметров
QDomDocument ObjectDocument; // Xml-документ
if(QFile::exists(sFileName)) // Если файл с таким именем существует, то...
{
QFile OutputFile(sFileName);
if(OutputFile.open(QIODevice::ReadOnly)) // открываем его для чтения...
{
if(!ObjectDocument.setContent(&OutputFile)) // и считываем.
{
OutputFile.close();
cout << "Невозможно прочитать файл!" << endl;
return;
}
QDomElement Root = ObjectDocument.documentElement(); // Устанавливаем "корень" (тег object)
QDomNode DomNode = Root.firstChild(); // Переходим на первый узел после корня
sValue = Root.attribute("numb"); // Читаем значение атрибута корня
QDomElement DomElement;
for(int i = 0; i != 3; i++) // Читаем все параметры,...
{
DomElement = DomNode.toElement(); // преобразуя узел в Dom-элемент
if(DomElement.tagName() == "par1")
{
QDomNode NodeText = DomElement.firstChild();
if(NodeText.nodeType() == QDomNode::TextNode) // Если узел - текстовый...
{
sPar[0] = NodeText.toText().data(); // Считываем текст и присваиваем строке.
}
}
else if(DomElement.tagName() == "par2")
{
QDomNode NodeText = DomElement.firstChild();
if(NodeText.nodeType() == QDomNode::TextNode)
{
sPar[1] = NodeText.toText().data();
}
}
if(DomElement.tagName() == "par3")
{
QDomNode NodeText = DomElement.firstChild();
if(NodeText.nodeType() == QDomNode::TextNode)
{
sPar[2] = NodeText.toText().data();
}
}
DomNode = DomNode.nextSibling(); // Переходим к следующему дочернему узлу корня.
}
}
}
cout << "Значение атрибута "numb" равно " << sValue.toStdString() << endl;
cout << "Первый параметр: " << sPar[0].toStdString() << endl;
cout << "Второй параметр: " << sPar[1].toStdString() << endl;
cout << "Третий параметр: " << sPar[2].toStdString() << endl;
}
//---------------------------------------------------------
int main()
{
WriteXml(QString("Object.xml"));
cout << "Документ записан успешно!" << endl;
ReadXml(QString("Object.xml"));
return 0;
}