Make basic parser
This commit is contained in:
parent
9b99763c2e
commit
1f12bca33f
9 changed files with 191 additions and 188 deletions
|
@ -34,6 +34,6 @@ std::string AbstractIDManager::generateId(){
|
||||||
return ss.str();
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string AbstractIDManager::getId(){
|
std::string AbstractIDManager::getId() const{
|
||||||
return this->id;
|
return this->id;
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
|
|
||||||
|
|
||||||
//Getters and setters
|
//Getters and setters
|
||||||
std::string getId();
|
std::string getId() const;
|
||||||
void setId(std::string id);
|
void setId(std::string id);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
/**
|
|
||||||
* @file FileManContainer.cpp
|
|
||||||
* @brief FileManContainer class definitions
|
|
||||||
* @author manzerbredes
|
|
||||||
* @date 11 Mars 2015
|
|
||||||
*
|
|
||||||
* Contain all implementation of FileManContainer class.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include "FileManContainer.hpp"
|
|
||||||
|
|
||||||
FileManContainer::FileManContainer(){
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void FileManContainer::addWebsite(Website website){
|
|
||||||
this->websites.push_back(website);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<Website> FileManContainer::getWebsites(){
|
|
||||||
return this->websites;
|
|
||||||
}
|
|
|
@ -1,46 +0,0 @@
|
||||||
/**
|
|
||||||
* @file FileManContainer.hpp
|
|
||||||
* @brief FileManContainer class definitions
|
|
||||||
* @author manzerbredes
|
|
||||||
* @date 11 Mars 2015
|
|
||||||
*
|
|
||||||
* Contain all definitions of FileManContainer class.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __FileManContainer__
|
|
||||||
#define __FileManContainer__
|
|
||||||
|
|
||||||
//----- std -----
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
//----- class -----
|
|
||||||
#include "Website.hpp"
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @class Website Website.hpp "/ParserClass/FileManContainer/Website.hpp"
|
|
||||||
* @brief Class for manager all FileMan container (websites etc...)
|
|
||||||
* @author manzerbredes
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
class FileManContainer{
|
|
||||||
|
|
||||||
public:
|
|
||||||
FileManContainer();
|
|
||||||
|
|
||||||
void addWebsite(Website website);
|
|
||||||
std::vector<Website> getWebsites();
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
std::vector<Website> websites;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -54,3 +54,12 @@ void Website::setPassword(std::string password){
|
||||||
void Website::setDescription(std::string description){
|
void Website::setDescription(std::string description){
|
||||||
this->description = description;
|
this->description = description;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Website::operator==(const Website& website) const{
|
||||||
|
if((this->getId()).compare(website.getId())==0){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -64,7 +64,9 @@ class Website : public AbstractIDManager {
|
||||||
void setPassword(std::string password);
|
void setPassword(std::string password);
|
||||||
void setDescription(std::string description);
|
void setDescription(std::string description);
|
||||||
|
|
||||||
|
//bool operator==(Website const& website1, Website const& website2) const;
|
||||||
|
|
||||||
|
bool operator==(const Website& website) const;
|
||||||
private:
|
private:
|
||||||
|
|
||||||
std::string title; ///< Title of the website
|
std::string title; ///< Title of the website
|
||||||
|
|
|
@ -13,26 +13,21 @@
|
||||||
|
|
||||||
|
|
||||||
FileManParser::FileManParser(std::string data){
|
FileManParser::FileManParser(std::string data){
|
||||||
this->data=data;
|
|
||||||
|
|
||||||
try {
|
//String to stringstream
|
||||||
xercesc::XMLPlatformUtils::Initialize();
|
(this->dataStream) << data;
|
||||||
}
|
|
||||||
catch (const xercesc::XMLException& toCatch) {
|
|
||||||
// Do your failure processing here
|
|
||||||
|
|
||||||
}
|
//Create parser
|
||||||
|
//parser.parse_stream(dataStream);
|
||||||
|
(this->parser).parse_file("Doxygen/doc.xml");
|
||||||
|
|
||||||
|
//Retrieve document
|
||||||
|
this->document=(this->parser).get_document();
|
||||||
|
|
||||||
xercesc::XercesDOMParser *parser = new xercesc::XercesDOMParser();
|
//Init root Node
|
||||||
xercesc::MemBufInputSource myxml_buf((const XMLByte*)this->data.c_str(), this->data.size(), "dummy",false);
|
this->rootNode=(this->document)->get_root_node();
|
||||||
|
|
||||||
parser->parse("Doxygen/doc.xml");
|
|
||||||
|
|
||||||
|
|
||||||
this->document=parser->getDocument();
|
|
||||||
this->root=this->document->getDocumentElement();
|
|
||||||
|
|
||||||
|
//Init container:
|
||||||
this->initWebsites();
|
this->initWebsites();
|
||||||
|
|
||||||
|
|
||||||
|
@ -41,93 +36,100 @@ FileManParser::FileManParser(std::string data){
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
FileManContainer FileManParser::getContainer(){
|
|
||||||
return this->container;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
std::string FileManParser::getData(){ return this->data;};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void FileManParser::initWebsites(){
|
void FileManParser::initWebsites(){
|
||||||
|
this->websites=new std::vector<Website>;
|
||||||
|
|
||||||
//Get websites élément
|
std::vector<xmlpp::Node*> websitesNodeSet=this->rootNode->find("//websites");
|
||||||
xercesc::DOMElement* websitesElement=this->getChildByTagName(this->root, "websites");
|
this->websitesNode=websitesNodeSet.at(0);
|
||||||
|
|
||||||
//Make list of website
|
std::vector<xmlpp::Node*> websiteNodeSet=this->websitesNode->find("*");
|
||||||
xercesc::DOMNodeList* websiteList=websitesElement->getChildNodes();
|
|
||||||
XMLSize_t websiteCount = websiteList->getLength();
|
for(int i=0;i<websiteNodeSet.size();i++){
|
||||||
|
xmlpp::Node* current=websiteNodeSet.at(i);
|
||||||
|
xmlpp::Element* currentElement=(xmlpp::Element*)current;
|
||||||
|
|
||||||
|
Website newWebsite;
|
||||||
|
newWebsite.setId(currentElement->get_attribute_value("id"));
|
||||||
|
|
||||||
|
std::vector<xmlpp::Node*> websiteChildren=current->find("*");
|
||||||
|
|
||||||
|
for(int j=0;j<websiteChildren.size();j++){
|
||||||
|
xmlpp::Element* currentChild=(xmlpp::Element*)websiteChildren.at(j);
|
||||||
|
|
||||||
|
std::list<xmlpp::Node*> contentNodes=currentChild->get_children();
|
||||||
|
xmlpp::CdataNode* cdataNode=(xmlpp::CdataNode*)contentNodes.front();
|
||||||
|
std::string cdataContent=cdataNode->get_content();
|
||||||
|
|
||||||
|
|
||||||
//Read the list of website
|
if(currentChild->get_name().compare("title")==0){
|
||||||
for(int i=0;i<websiteCount;i++){
|
newWebsite.setTitle(cdataContent);
|
||||||
|
|
||||||
xercesc::DOMNode* current=websiteList->item(i);
|
|
||||||
std::string TagName=xercesc::XMLString::transcode(current->getNodeName());
|
|
||||||
|
|
||||||
if( current->getNodeType() == xercesc::DOMNode::ELEMENT_NODE ) {
|
|
||||||
Website newWebsite;
|
|
||||||
|
|
||||||
//Get id
|
|
||||||
XMLCh* idXMLCh=(XMLCh*)((xercesc::DOMElement*)current)->getAttribute((XMLCh*) xercesc::XMLString::transcode("id"));
|
|
||||||
//Convert id to string from XMLCh
|
|
||||||
std::string id=xercesc::XMLString::transcode(idXMLCh);
|
|
||||||
|
|
||||||
//Assign id
|
|
||||||
newWebsite.setId(id);
|
|
||||||
|
|
||||||
//Assign title
|
|
||||||
newWebsite.setTitle(\
|
|
||||||
this->getContentOfChild(dynamic_cast< xercesc::DOMElement* >( current ),"title"));
|
|
||||||
|
|
||||||
//Assign url
|
|
||||||
newWebsite.setUrl(\
|
|
||||||
this->getContentOfChild(dynamic_cast< xercesc::DOMElement* >( current ),"url"));
|
|
||||||
|
|
||||||
//Assign username
|
|
||||||
newWebsite.setUsername(\
|
|
||||||
this->getContentOfChild(dynamic_cast< xercesc::DOMElement* >( current ),"username"));
|
|
||||||
|
|
||||||
//Assign password
|
|
||||||
newWebsite.setPassword(\
|
|
||||||
this->getContentOfChild(dynamic_cast< xercesc::DOMElement* >( current ),"password"));
|
|
||||||
|
|
||||||
//Assign description
|
|
||||||
newWebsite.setDescription(\
|
|
||||||
this->getContentOfChild(dynamic_cast< xercesc::DOMElement* >( current ),"description"));
|
|
||||||
|
|
||||||
//Add website to container
|
|
||||||
this->container.addWebsite(newWebsite);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
xercesc::DOMElement* FileManParser::getChildByTagName(xercesc::DOMElement* node, std::string TagName){
|
|
||||||
xercesc::DOMNodeList* nodeList=node->getChildNodes();
|
|
||||||
XMLSize_t nodeCount = nodeList->getLength();
|
|
||||||
xercesc::DOMElement* returnElement=NULL;
|
|
||||||
|
|
||||||
for(int i=0;i<nodeCount;i++){
|
|
||||||
|
|
||||||
xercesc::DOMNode* current=nodeList->item(i);
|
|
||||||
std::string currentTagName=xercesc::XMLString::transcode(current->getNodeName());
|
|
||||||
|
|
||||||
if( current->getNodeType() == xercesc::DOMNode::ELEMENT_NODE ) {
|
|
||||||
if(currentTagName.compare(TagName)==0){
|
|
||||||
returnElement=dynamic_cast< xercesc::DOMElement* >( current );
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
else if(currentChild->get_name().compare("url")==0){
|
||||||
|
newWebsite.setUrl(cdataContent);
|
||||||
|
}
|
||||||
|
else if(currentChild->get_name().compare("username")==0){
|
||||||
|
newWebsite.setUsername(cdataContent);
|
||||||
|
}
|
||||||
|
else if(currentChild->get_name().compare("password")==0){
|
||||||
|
newWebsite.setPassword(cdataContent);
|
||||||
|
}
|
||||||
|
else if(currentChild->get_name().compare("description")==0){
|
||||||
|
newWebsite.setDescription(cdataContent);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this->websites->push_back(newWebsite);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return returnElement;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::string FileManParser::getContentOfChild(xercesc::DOMElement* node,std::string TagName){
|
|
||||||
xercesc::DOMElement* child=this->getChildByTagName(node,TagName);
|
|
||||||
return xercesc::XMLString::transcode(child->getTextContent());
|
std::string FileManParser::getDocument(){
|
||||||
|
std::string data=(this->document)->write_to_string();
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<Website>* FileManParser::getWebsites(){
|
||||||
|
return this->websites;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FileManParser::updateParser(){
|
||||||
|
this->rootNode->remove_child(this->websitesNode);
|
||||||
|
|
||||||
|
xmlpp::Element* websitesNode=this->rootNode->add_child("websites");
|
||||||
|
this->websitesNode=(xmlpp::Node*)websitesNode;
|
||||||
|
|
||||||
|
for(int i=0;i<this->websites->size();i++){
|
||||||
|
xmlpp::Element* current=this->websitesNode->add_child("website");
|
||||||
|
Website currentWebsite=this->websites->at(i);
|
||||||
|
|
||||||
|
current->set_attribute("id", currentWebsite.getId());
|
||||||
|
xmlpp::Element* title=current->add_child("title");
|
||||||
|
title->add_child_cdata(currentWebsite.getTitle());
|
||||||
|
|
||||||
|
xmlpp::Element* url=current->add_child("url");
|
||||||
|
url->add_child_cdata(currentWebsite.getUrl());
|
||||||
|
|
||||||
|
xmlpp::Element* username=current->add_child("username");
|
||||||
|
username->add_child_cdata(currentWebsite.getUsername());
|
||||||
|
|
||||||
|
xmlpp::Element* password=current->add_child("password");
|
||||||
|
password->add_child_cdata(currentWebsite.getPassword());
|
||||||
|
|
||||||
|
xmlpp::Element* description=current->add_child("description");
|
||||||
|
description->add_child_cdata(currentWebsite.getDescription());
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,23 +8,20 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
//----- std -----
|
//----- std -----
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
//----- class -----
|
//----- class -----
|
||||||
#include "Website.hpp"
|
#include "Website.hpp"
|
||||||
#include "FileManContainer.hpp"
|
|
||||||
|
|
||||||
//----- xerces -----
|
//----- libxml++ -----
|
||||||
#include <xercesc/parsers/XercesDOMParser.hpp>
|
#include <cstdlib>
|
||||||
#include <xercesc/dom/DOM.hpp>
|
#include <libxml++/libxml++.h>
|
||||||
#include <xercesc/framework/MemBufInputSource.hpp>
|
|
||||||
#include <xercesc/sax/HandlerBase.hpp>
|
|
||||||
#include <xercesc/util/XMLString.hpp>
|
|
||||||
#include <xercesc/util/PlatformUtils.hpp>
|
|
||||||
#include <xercesc/util/XercesDefs.hpp>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,27 +29,44 @@ class FileManParser{
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
//Constructor
|
||||||
FileManParser(std::string data);
|
FileManParser(std::string data);
|
||||||
|
|
||||||
|
|
||||||
|
//Get document in string
|
||||||
|
std::string getDocument();
|
||||||
|
|
||||||
FileManContainer getContainer();
|
|
||||||
|
|
||||||
void initWebsites();
|
//Get container vector pointer:
|
||||||
|
std::vector<Website>* getWebsites();
|
||||||
|
|
||||||
std::string getData();
|
|
||||||
|
|
||||||
xercesc::DOMElement* getChildByTagName(xercesc::DOMElement* node, std::string TagName);
|
|
||||||
std::string getContentOfChild(xercesc::DOMElement* node,std::string TagName);
|
//Apply change that have made on container
|
||||||
|
void updateParser();
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
xercesc::DOMDocument* document; ///< contain the document
|
|
||||||
|
|
||||||
xercesc::DOMElement* root;
|
//Instaciate all website container
|
||||||
|
void initWebsites();
|
||||||
|
|
||||||
FileManContainer container; ///< contain all container
|
|
||||||
|
|
||||||
std::string data; ///< contain data to parse
|
//Parser attributes
|
||||||
|
std::stringstream dataStream;
|
||||||
|
xmlpp::DomParser parser;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//Document attributes
|
||||||
|
xmlpp::Document* document;
|
||||||
|
xmlpp::Node* rootNode;
|
||||||
|
|
||||||
|
|
||||||
|
//Website attributes
|
||||||
|
xmlpp::Node* websitesNode;
|
||||||
|
std::vector<Website> *websites;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
59
main.cpp
59
main.cpp
|
@ -20,9 +20,13 @@
|
||||||
//----- class -----
|
//----- class -----
|
||||||
#include "FileManIOFile.hpp"
|
#include "FileManIOFile.hpp"
|
||||||
#include "FileManParser.hpp"
|
#include "FileManParser.hpp"
|
||||||
#include "FileManContainer.hpp"
|
|
||||||
#include "Website.hpp"
|
#include "Website.hpp"
|
||||||
|
|
||||||
|
#include <list>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <libxml++/nodes/node.h>
|
||||||
|
#include <libxml++/libxml++.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @fn int main(int argc, char *argv[])
|
* @fn int main(int argc, char *argv[])
|
||||||
* @author manzerbredes
|
* @author manzerbredes
|
||||||
|
@ -41,7 +45,8 @@ int main(int argc, char *argv[]){
|
||||||
std::cout << fichier.getData();*/
|
std::cout << fichier.getData();*/
|
||||||
|
|
||||||
|
|
||||||
std::string xml="<?xml version=\"1.0\" standalone=\"yes\" ?>\n\
|
std::stringstream xml;
|
||||||
|
xml <<"<?xml version=\"1.0\" standalone=\"yes\" ?>\n\
|
||||||
<forgetIt> \n\
|
<forgetIt> \n\
|
||||||
<websites> \n\
|
<websites> \n\
|
||||||
\n\
|
\n\
|
||||||
|
@ -50,13 +55,55 @@ int main(int argc, char *argv[]){
|
||||||
";
|
";
|
||||||
|
|
||||||
|
|
||||||
FileManParser parser(xml);
|
/*FileManParser parser(xml);
|
||||||
|
|
||||||
|
|
||||||
FileManContainer container= parser.getContainer();
|
std::vector<Website> websites= parser.getContainer();
|
||||||
std::vector<Website> websites= container.getWebsites();
|
std::cout << typeid(websites.at(0)).name();*/
|
||||||
std::cout << websites.at(0).getId();
|
|
||||||
|
/*xmlpp::DomParser parser;
|
||||||
|
parser.parse_file("Doxygen/doc.xml");
|
||||||
|
xmlpp::Document* doc=parser.get_document();
|
||||||
|
const xmlpp::Node* pNode = doc->get_root_node(); //deleted by DomParser.
|
||||||
|
const Glib::ustring nom="news";
|
||||||
|
const Glib::ustring nm="";
|
||||||
|
xmlpp::Element* elem=(xmlpp::Element*)pNode;*/
|
||||||
|
|
||||||
|
//std::vector<xmlpp::Node*> websites=pNode->find("//websites/*/attribute::id");
|
||||||
|
/*
|
||||||
|
xmlpp::Element* ell=(xmlpp::Element*)websites.at(0);
|
||||||
|
ell->set_child_text("56");
|
||||||
|
elem->add_child(nom);
|
||||||
|
|
||||||
|
std::cout << doc->write_to_string();*/
|
||||||
|
//std::cout << (elem->get_child_text())->get_content();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
FileManParser fichier("loic");
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<Website> *bb=fichier.getWebsites();
|
||||||
|
|
||||||
|
|
||||||
|
Website a;
|
||||||
|
a.setTitle("pierre");
|
||||||
|
|
||||||
|
|
||||||
|
bb->push_back(a);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
fichier.updateParser();
|
||||||
|
|
||||||
|
std::cout << fichier.getDocument();
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue