Node(std::string tag, Node *parent, std::string attributes, std::string content); Node(std::string tag, std::string attributes, std::string content); Node(std::string tag); Node();
std::string Node::getTag(); std::string Node::getAttributes(); std::string Node::getContent(); void Node::setTag(std::string tag); void Node::setContent(std::string content); void Node::setAttributes(std::string attributes);Abbiamo dei metodi ulteriori che contribuiscono a strutturare il file xml:
int Node::getHierarchy(); // restituisce il valore della gerarchia (il nodo root è sempre 0) Node *Node::getParent(); // restituisce il nodo genitore (se si usa in riferimento al nodo root il metodo mostra un messaggio di errore) Node *Node::getChild(int n); // restituisce il n-esimo figlio del nodo in questione (se il figlio non esiste viene mostrato un errore) void Node::addChild(Node *child); // aggiunge il nodo child al nodo in oggetto static void Node::show(Node *node); // mostra tutti i nodi che discendono dal nodo parametro (se si vuole visualizzare tutto il documento basta passare il nodo root) static void Node::save(Node *node, std::string filename); // salva il file xml static Node *Node::load(std::string filename); // carica il file xml e restituisce il nodo rootDi seguito un piccolo esempio di utilizzo della libreria:
// // main.cpp // #include "Node.h" #include <iostream> int main(int argc, char **argv) { Node *root = new Node("1"); root->addChild(new Node("2")); root->getChild(0)->addChild(new Node("3")); root->getChild(0)->addChild(new Node("4")); root->getChild(0)->getChild(1)->addChild(new Node("5")); root->getChild(0)->getChild(1)->getChild(0)->addChild(new Node("6")); root->getChild(0)->getChild(1)->getChild(0)->addChild(new Node("7")); root->getChild(0)->getChild(1)->getChild(0)->getChild(1)->addChild(new Node("8")); root->getChild(0)->getChild(1)->getChild(0)->getChild(1)->addChild(new Node("9")); root->getChild(0)->getChild(1)->getChild(0)->getChild(1)->addChild(new Node("10")); root->getChild(0)->addChild(new Node("11")); root->getChild(0)->getChild(2)->addChild(new Node("12")); root->getChild(0)->getChild(2)->getChild(0)->addChild(new Node("13")); Node::save(root, "prova.xml"); } result: <1> <2> <3> </3> <4> <5> <6> </6> <7> <8> </8> <9> </9> <10> </10> </7> </5> </4> <11> <12> <13> </13> </12> </11> </2> </1>
// // Node.h // #ifndef Node_h #define Node_h #include <string> #include <vector> class Node { private: std::string tag; std::string attributes; std::string content; int hierarchy; Node *parent; std::vector <Node*> children; public: Node(std::string tag, Node *parent, std::string attributes, std::string content); Node(std::string tag, std::string attributes, std::string content); Node(std::string tag); Node(); ~Node(); void setTag(std::string tag); void setContent(std::string content); void setAttributes(std::string attributes); void setParent(Node *parent); void setHierarchy(int hierarchy); void addChild(Node *child); void removeChild(int n); int countChildren(); std::string getTag(); std::string getContent(); std::string getAttributes(); int getHierarchy(); Node *getChild(int n); Node *getParent(); static std::string toString(Node *node); static void show(Node *node); static void save(Node *node, std::string filename); static Node *load(std::string filename); }; #endif // // Node.cpp // #include "Node.h" #include <iostream> #include <fstream> Node::Node(std::string tag, Node *parent, std::string attributes, std::string content) { this->setTag(tag); this->setParent(parent); this->setContent(content); this->setAttributes(attributes); } Node::Node(std::string tag, std::string attributes, std::string content) { this->setTag(tag); this->setContent(content); this->setAttributes(attributes); this->parent = 0; } Node::Node(std::string tag) { this->setTag(tag); this->setContent(""); this->setAttributes(""); this->parent = 0; } Node::Node() { this->setTag(""); this->parent = 0; this->hierarchy = 0; this->setContent(""); this->setAttributes(""); } Node::~Node() { for(int i = 0; i < this->children.size(); i++) { delete this->children[i]; } this->children.clear(); } void Node::setTag(std::string tag) { this->tag = tag; } void Node::setContent(std::string content) { this->content = content; } void Node::setAttributes(std::string attributes) { this->attributes = attributes; } void Node::setParent(Node *parent) { parent->addChild(this); this->parent = parent; } void Node::setHierarchy(int hierarchy) { this->hierarchy = hierarchy; } std::string Node::getTag() { return this->tag; } std::string Node::getContent() { return this->content; } std::string Node::getAttributes() { return this->attributes; } Node *Node::getParent() { if(this->hierarchy > 0) { return this->parent; } else { std::cout << "ERROR: root doesn't have a parent.\n"; return 0; } } int Node::getHierarchy() { return this->hierarchy; } void Node::addChild(Node *child) { this->children.push_back(child); child->setHierarchy(this->hierarchy + 1); } void Node::removeChild(int n) { if(n < this->children.size()) { delete this->children[n]; this->children.erase(this->children.begin() + n); } else { std::cout << "ERROR: child not exists.\n"; } } Node *Node::getChild(int n) { if(n < this->children.size()) { return this->children[n]; } else { std::cout << "ERROR: child not exists.\n"; return 0; } } int Node::countChildren() { return this->children.size(); } std::string Node::toString(Node *node) { std::string str = ""; for(int i = 0; i < node->getHierarchy(); i++) { str += "\t"; } str += "<" + node->getTag(); if(node->getAttributes() != "") { str += " " + node->getAttributes(); } str += ">\n"; if(node->countChildren()) { for(int i = 0; i < node->countChildren(); i++) { str += Node::toString(node->getChild(i)); } } for(int i = 0; i < node->getHierarchy(); i++) { str += "\t"; } str += "</" + node->getTag() + ">\n"; return str; } void Node::show(Node *node) { std::cout << Node::toString(node); } void Node::save(Node *node, std::string filename) { std::ofstream myfile(filename); if(myfile.is_open()) { std::string str = Node::toString(node); myfile << str; myfile.close(); } } Node *Node::load(std::string filename) { Node *root; std::ifstream file; file.open(filename.c_str(), std::ios::in); std::string str; if(file.is_open()) { while(!file.eof()) { std::string s; getline(file, s); str += s + "\n"; } file.close(); } std::vector <Node*> vec; unsigned int hierarchy = 0; bool h = true; while(h) { int j = str.find("<"); if(j == -1){h = false;} else { int k = str.find(">"); std::string tag; std::string attributes; std::string t = str.substr(j + 1, k - j - 1); std::string c = str.substr(0, j); int l = t.find(" "); if(l != -1) { tag = t.substr(0, l); attributes = t.substr(l + 1); } else { tag = t; attributes = ""; } if(tag[0] == 47) { hierarchy--; vec.pop_back(); } else if(t.substr(0, 3) == "!--" && t.substr(t.length() - 2) == "--") { // comment } else { Node *node = new Node(); node->setHierarchy(hierarchy); node->setTag(tag); node->setAttributes(attributes); if(vec.size() == 0) { root = node; } else { node->setParent(vec.back()); } vec.push_back(node); hierarchy++; } str = str.substr(k + 1); } } return root; }
Mi chiamo Cosimo Saccone e sono un programmatore napoletano di 44 anni con oltre 35 anni di esperienza nella programmazione (BASIC, Assembly). Realizzo progetti e programmi utilizzando i principali e più diffusi linguaggi (C, C++, PHP, Javascript, HTML) e software per la grafica (Photoshop, Illustrator, 3dsMax). Anche se la grafica rappresenta il mio principale settore di interesse, non disdegno il lavoro di back-end e di organizzazione dati e sono attento agli aspetti di efficienza e di risparmio delle risorse tipica della programmazione di basso livello (specie nel settore della grafica 3d). Realizzo siti internet, applicativi desktop e servizi di vario tipo. Ho una buona conoscenza della libreria OpenGL per lo sviluppo di applicazioni 3d interattive in C/C++. Cerco di adottare uno stile di programmazione fortemente ordinato e modulare. Possiedo, inoltre, una buona capacità di elaborazione della documentazione. Ho vari hobbies tra cui la pittura, la ginnastica e le lunghe passeggiate in solitudine.
Al fine di migliorare l’esperienza di navigazione sul nostro sito noi di cosimosaccone.com e i nostri partner selezionati elaboriamo i dati personali, compreso l’indirizzo IP e le pagine visitate, in relazione alla tua navigazione nei contenuti del sito, per i seguenti scopi:
Accesso alle informazioni
Dati precisi di geolocalizzazione
Misurazione del pubblico
Pubblicità e contenuti personalizzati
Ti ricordiamo che il termine cookie si riferisce a una porzione di dati inviati al tuo browser da un web server. Il cookie viene memorizzato sul tuo dispositivo e riconosciuto dal sito web che lo ha inviato in ogni navigazione successiva. Se vuoi saperne di più e compiere una scelta diversa, come il rifiuto del trattamento dei tuoi dati personali, clicca qui sulla nostra privacy policy. Potrai sempre modificare le tue scelte e impostare i singolo cookies selezionando il bottone qui sotto.
OK