0001:
0014:
0015:
0016:
0017:
0046:
0047:
0048:
0049: #include <libxml/tree.h>
0050: #include <libxml/parser.h>
0051:
0052:
0053: #include <iostream>
0054: #include <vector>
0055: using namespace std;
0056:
0057:
0058: class matrix
0059: {
0060: protected:
0061:
0062: vector< vector< float > > m;
0063:
0064:
0065: void parse_rows(xmlDocPtr doc, xmlNodePtr cur);
0066: void parse_cols(int a, xmlDocPtr doc, xmlNodePtr cur);
0067: public:
0068: int size(){ return m.size(); }
0069:
0070: vector<float> & operator[](const int i){ return m[i]; }
0071:
0072:
0073: void print();
0074:
0075:
0076: void load_matrix(xmlDocPtr doc, xmlNodePtr cur) { parse_rows(doc,cur); }
0077: int save_matrix(const char * fname);
0078: };
0079:
0080:
0081: void matrix::print()
0082: {
0083: for(int a=0;a<m.size();a++)
0084: {
0085: cout << "\n";
0086: for(int b=0;b<m[a].size();b++)
0087: {
0088: cout << m[a][b] << "\t";
0089: }
0090: }
0091: }
0092:
0093: void matrix::parse_rows(xmlDocPtr doc, xmlNodePtr cur)
0094: {
0095:
0096: cur = cur->xmlChildrenNode;
0097:
0098:
0099: int a=0;
0100: while (cur != NULL)
0101: {
0102: if (!xmlStrcmp(cur->name, (const xmlChar *)"r"))
0103: {
0104:
0105: m.push_back(vector<float>());
0106:
0107: parse_cols(a,doc,cur);
0108: a++;
0109: }
0110: cur = cur->next;
0111: }
0112: }
0113:
0114:
0115: void matrix::parse_cols(int a, xmlDocPtr doc, xmlNodePtr cur)
0116: {
0117:
0118:
0119: cur = cur->xmlChildrenNode;
0120:
0121:
0122: while (cur != NULL)
0123: {
0124: if (!xmlStrcmp(cur->name, (const xmlChar *)"c"))
0125: m[a].push_back
0126: (
0127: atof((const char*)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1))
0128: );
0129:
0130: cur = cur->next;
0131: }
0132: }
0133:
0134: int parse_xml(const char * filename)
0135: {
0136: xmlDocPtr doc;
0137: xmlNodePtr cur;
0138:
0139:
0140:
0141:
0142:
0143: doc = xmlParseFile(filename);
0144: if (doc == NULL) return(NULL);
0145:
0146:
0147:
0148:
0149:
0150: cur = xmlDocGetRootElement(doc);
0151: if (cur == NULL)
0152: {
0153: cerr << "\nempty document";
0154: xmlFreeDoc(doc);
0155: return(NULL);
0156: }
0157: if (xmlStrcmp(cur->name, (const xmlChar *) "root"))
0158: {
0159: cerr << "document of the wrong type, root node != root";
0160: xmlFreeDoc(doc);
0161: return(NULL);
0162: }
0163:
0164:
0165:
0166:
0167:
0168:
0169:
0170:
0171: cur = cur->xmlChildrenNode;
0172:
0173: int a=0;
0174:
0175: vector< matrix > vm;
0176:
0177: while(cur != NULL)
0178: {
0179: if (!xmlStrcmp(cur->name, (const xmlChar *) "matrix"))
0180: {
0181:
0182: vm.push_back(matrix());
0183: vm[a].load_matrix(doc,cur);
0184: cout << "\n\nmatrix nr. " << a << ":"; vm[a].print();
0185: a++;
0186: }
0187: else
0188: {
0189:
0190: fprintf(stderr,"document of the wrong type, was '%s', Jobs expected", cur->name);
0191: cerr << "xmlDocDump follows\n";
0192: xmlDocDump ( stderr, doc );
0193: cerr << "xmlDocDump finished\n";
0194: xmlFreeDoc(doc);
0195: return(NULL);
0196: }
0197:
0198: cur = cur->next;
0199: }
0200:
0201:
0202: vm[0].save_matrix("matrix_save.xml");
0203: return 1;
0204: }
0205:
0206:
0207: int main()
0208: {
0209:
0210: xmlKeepBlanksDefault(0);
0211:
0212: if( !parse_xml("matrix.xml") )
0213: {
0214: cerr << "error opening file.";
0215: return 1;
0216: }
0217:
0218:
0219: xmlCleanupParser();
0220:
0221: return 0;
0222: }
0223:
0224:
0225: int matrix::save_matrix(const char * fname)
0226: {
0227:
0228: xmlDocPtr doc;
0229: xmlNodePtr root;
0230: xmlNodePtr cur;
0231:
0232: doc = xmlNewDoc((const xmlChar*)"1.0");
0233:
0234:
0235: xmlSetDocCompressMode (doc,9);
0236:
0237:
0238:
0239: root = xmlNewDocNode(doc, NULL, (const xmlChar*)"root", NULL);
0240:
0241: xmlDocSetRootElement(doc, root);
0242:
0243: cur=xmlNewChild(root,NULL,(const xmlChar*)"matrix",NULL);
0244:
0245:
0246: xmlNodePtr rows;
0247: xmlNodePtr cols;
0248:
0249: for(int a=0;a<m.size();a++)
0250: {
0251: rows=xmlNewChild(cur,NULL,(const xmlChar*)"r",NULL);
0252: for(int b=0;b<m[a].size();b++)
0253: {
0254: cols=xmlNewChild(rows,NULL,(const xmlChar*)"c",(const xmlChar*)"34.3");
0255: }
0256: }
0257: return xmlSaveFormatFile (fname, doc,1);
0258:
0259: }
0260: