XML - статьи

Пример для документа с повторяющимися элементами


Случай, когда в XML-документе имеется множественное включение одноименных элементов, встречается достаточно часто, и поэтому стоит рассмотреть реализацию объектного представления для таких документов. В качестве примера возьмем документ ED232 (тоже немного упрощенный): <?xml version="1.0" encoding="WINDOWS-1251"?> <ED232 xmlns="urn:cbr-ru:ed:v2.0" EDAuthor="4525000000" EDDate="2008-03-14" EDNo="1005"> <PLAN BS="10101" RKC="2" Type="2"/> <PLAN BS="10207" RKC="1" Type="2"/> <PLAN BS="10208" RKC="1" Type="2"/> </ED232>

Объявление класса для этого документа может выглядеть так (опускаем объявление класса CPLAN): class CPLAN; typedef QVector<CPLAN *> CPLANList;

class CED232 : public CED { private: virtual CNode* getNode(const QString &name); virtual bool writeNode(QXmlStreamWriter& writer,const QString& nsUri); public: CED232(); ~CED232();

CEDRefID InitialED; CPLANList PLAN; };

Как видно, повторяющаяся часть документа реализована в виде списка с использованием шаблона QVector, аналогичного вектору стандартной библиотеки. В список содержатся указатели на объекты, созданные в памяти. Поэтому для класса CED232 нужен деструктор, который освобождает память, занятую объектами CPLAN: CED232::~CED232(){ for(int i=0; i<PLAN.size(); i++) delete PLAN[i]; }

Методы класса можно реализовать так: CNode* CED232::getNode(const QString &name){ if(name==nodeName) return this; else if(name=="PLAN"){ CPLAN* info=new CPLAN(); PLAN.push_back(info); return info; }else return 0; } //----------------------------------------------------------------------

bool CED232::writeNode(QXmlStreamWriter& writer,const QString& nsUri){ writer.writeStartElement(nsUri,nodeName); writer.writeAttribute("EDNo", EDNo); writer.writeAttribute("EDDate", EDDate); writer.writeAttribute("EDAuthor", EDAuthor);

for(int i=0; i<PLAN.size(); i++) PLAN[i]->writeNode(writer,nsUri);

writer.writeEndElement(); return true; }



Содержание раздела