⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlparser.cc

📁 分布式仿真 开放源码
💻 CC
字号:
// ----------------------------------------------------------------------------// CERTI - HLA RunTime Infrastructure// Copyright (C) 2003  ONERA//// This file is part of CERTI-libCERTI//// CERTI-libCERTI is free software ; you can redistribute it and/or// modify it under the terms of the GNU Lesser General Public License// as published by the Free Software Foundation ; either version 2 of// the License, or (at your option) any later version.//// CERTI-libCERTI is distributed in the hope that it will be useful, but// WITHOUT ANY WARRANTY ; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU// Lesser General Public License for more details.//// You should have received a copy of the GNU Lesser General Public// License along with this program ; if not, write to the Free Software// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307// USA//// $Id: XmlParser.cc,v 3.16 2003/11/10 14:37:22 breholee Exp $// ----------------------------------------------------------------------------#include <config.h>#include "XmlParser.hh"#include "ObjectClassAttribute.hh"#include "RoutingSpace.hh"#include "PrettyDebug.hh"using std::string ;using std::cerr ;using std::endl ;#ifdef HAVE_XML#define NODE_OBJECT_MODEL (const xmlChar*) "objectModel"#define NODE_OBJECTS (const xmlChar*) "objects"#define NODE_OBJECT_CLASS (const xmlChar*) "objectClass"#define NODE_INTERACTIONS (const xmlChar*) "interactions"#define NODE_INTERACTION_CLASS (const xmlChar*) "interactionClass"#define NODE_ATTRIBUTE (const xmlChar*) "attribute"#define NODE_PARAMETER (const xmlChar*) "parameter"#define NODE_ROUTING_SPACE (const xmlChar*) "routingSpace"#define NODE_DIMENSIONS (const xmlChar*) "dimensions"#define NODE_DIMENSION (const xmlChar*) "dimension"#define ATTRIBUTE_NAME (const xmlChar*) "name"#define ATTRIBUTE_TRANSPORTATION (const xmlChar*) "transportation"#define ATTRIBUTE_ORDER (const xmlChar*) "order"#define ATTRIBUTE_SPACE (const xmlChar*) "space"#define VALUE_RELIABLE (const xmlChar*) "HLAreliable"#define VALUE_BESTEFFORT (const xmlChar*) "HLAbestEffort"#define VALUE_TSO (const xmlChar*) "TimeStamp"#define VALUE_RO (const xmlChar*) "Receive"namespace certi {static pdCDebug D("XMLPARSER", "(XmlParser) ");XmlParser::XmlParser(RootObject* r){    root = r ;    freeObjectClassHandle = 1 ;    freeInteractionClassHandle = 1 ;    freeAttributeHandle = 1 ;    freeParameterHandle = 1 ;    freeSpaceHandle = 1 ;}// ----------------------------------------------------------------------------//! Main method to parse .xml fileRootObject*XmlParser::parse(string s){    D.Out(pdTrace, "Starting to parse XML file");    filename = s ;    // transportation = HLAreliable    // order = TimeStamp    doc = xmlParseFile(filename.c_str());    // Did libXML manage to parse the file ?    if (doc == 0) {        cerr << "XML file not parsed successfully" << endl ;        xmlFreeDoc(doc);        return 0 ;    }    // Is there a root element ?    cur = xmlDocGetRootElement(doc);    if (cur == 0) {        cerr << "XML file is empty" << endl ;        xmlFreeDoc(doc);        return 0 ;    }    // Is this root element an objectModel ?    if (xmlStrcmp(cur->name, (const xmlChar *) NODE_OBJECT_MODEL)) {        cerr << "Wrong XML file: not the expected root node" << endl ;        return 0 ;    }    D.Out(pdTrace, "XML file looks ok, starting main loop");    // First Loop (Routing Spaces)    cur = xmlDocGetRootElement(doc);    cur = cur->xmlChildrenNode ;    while (cur != NULL) {        if ((!xmlStrcmp(cur->name, NODE_ROUTING_SPACE))) {            D.Out(pdTrace, "Found a routing space");            xmlNodePtr prev = cur ;            this->parseRoutingSpace();            cur = prev ;        }        cur = cur->next ;    }    // Second Loop (Object and Interaction classes)    cur = xmlDocGetRootElement(doc);    cur = cur->xmlChildrenNode ;    while (cur != NULL) {        if ((!xmlStrcmp(cur->name, NODE_OBJECTS))) {            D.Out(pdTrace, "Found a group of object classes");            xmlNodePtr prev = cur ;            cur = cur->xmlChildrenNode ;            while (cur != NULL) {                if ((!xmlStrcmp(cur->name, NODE_OBJECT_CLASS))) {                    this->parseClass(0);                }                cur = cur->next ;            }            cur = prev ;        }        if ((!xmlStrcmp(cur->name, NODE_INTERACTIONS))) {            D.Out(pdTrace, "Found a group of interaction classes");            xmlNodePtr prev = cur ;            cur = cur->xmlChildrenNode ;            while (cur != NULL) {                if ((!xmlStrcmp(cur->name, NODE_INTERACTION_CLASS))) {                    this->parseInteraction(0);                }                cur = cur->next ;            }            cur = prev ;        }        cur = cur->next ;    }    xmlFreeDoc(doc);    D[pdTrace] << "XmlParser: finished parsing" << endl ;    return root ;}// ----------------------------------------------------------------------------//! Parse the current class nodevoidXmlParser::parseClass(ObjectClass* parent){    D[pdTrace] << "New Object Class" << endl ;    xmlNodePtr prev = cur ;    ObjectClass* current = new ObjectClass();    current->setName((char *) xmlGetProp(cur, ATTRIBUTE_NAME));    current->setHandle(freeObjectClassHandle++);    root->ObjectClasses->addClass(current);    if (parent != 0)        root->ObjectClasses->buildParentRelation(current, parent);    cur = cur->xmlChildrenNode ;    while (cur != NULL) {        // Attributes        if ((!xmlStrcmp(cur->name, NODE_ATTRIBUTE))) {            ObjectClassAttribute *attr = new ObjectClassAttribute();            // Name            attr->setName((char *) xmlGetProp(cur, ATTRIBUTE_NAME));            // Handle            attr->setHandle(freeAttributeHandle++);            // Transportation            if (!xmlStrcmp(xmlGetProp(cur, ATTRIBUTE_TRANSPORTATION),                           VALUE_RELIABLE))                attr->transport = RELIABLE ;            else if (!xmlStrcmp(xmlGetProp(cur, ATTRIBUTE_TRANSPORTATION),                                VALUE_BESTEFFORT))                attr->transport = BEST_EFFORT ;            // Order            if (!xmlStrcmp(xmlGetProp(cur, ATTRIBUTE_ORDER), VALUE_TSO))                attr->order = TIMESTAMP ;            else if (!xmlStrcmp(xmlGetProp(cur, ATTRIBUTE_ORDER), VALUE_RO))                attr->order = RECEIVE ;            // Routing space            char *space = (char *) xmlGetProp(cur, ATTRIBUTE_SPACE);            if (space) {                SpaceHandle h ;                try {                    h = root->getRoutingSpaceHandle(string(space));                }                catch (Exception &e) {                    cerr << "warning: Incorrect space name for attribute"                         << endl ;                }                attr->setSpace(h);            }            // Attribute complete, adding to the class            current->addAttribute(attr);        }        // Subclass        if ((!xmlStrcmp(cur->name, NODE_OBJECT_CLASS))) {            this->parseClass(current);        }        cur = cur->next ;    }    cur = prev ;}// ----------------------------------------------------------------------------//! Parse the current interaction nodevoidXmlParser::parseInteraction(Interaction* parent){    D[pdTrace] << "New Interaction Class" << endl ;    xmlNodePtr prev = cur ;    Interaction* current = new Interaction();    // Name    current->setName((char *) xmlGetProp(cur, ATTRIBUTE_NAME));    // Handle    current->setHandle(freeInteractionClassHandle++);    // Transportation    if (!xmlStrcmp(xmlGetProp(cur, ATTRIBUTE_TRANSPORTATION), VALUE_RELIABLE))        current->transport = RELIABLE ;    else if (!xmlStrcmp(xmlGetProp(cur, ATTRIBUTE_TRANSPORTATION),                        VALUE_BESTEFFORT))        current->transport = BEST_EFFORT ;    // Order    if (!xmlStrcmp(xmlGetProp(cur, ATTRIBUTE_ORDER), VALUE_TSO))        current->order = TIMESTAMP ;    else if (!xmlStrcmp(xmlGetProp(cur, ATTRIBUTE_ORDER), VALUE_RO))        current->order = RECEIVE ;    // Routing space    char *space = (char *) xmlGetProp(cur, ATTRIBUTE_SPACE);    if (space) {        SpaceHandle h ;        try {            h = root->getRoutingSpaceHandle(string(space));        }        catch (Exception &e) {            cerr << "warning: Incorrect space name for interaction"                 << endl ;        }        current->setSpace(h);    }    // Add to interactions list, and build inheritance relation    root->Interactions->addClass(current);    if (parent != 0)        root->Interactions->buildParentRelation(current, parent);    cur = cur->xmlChildrenNode ;    while (cur != NULL) {        if ((!xmlStrcmp(cur->name, NODE_PARAMETER))) {            Parameter *param = new Parameter();            param->setName((char *) xmlGetProp(cur, ATTRIBUTE_NAME));            param->setHandle(freeParameterHandle++);            current->addParameter(param);        }        // Subinteraction        if ((!xmlStrcmp(cur->name, NODE_INTERACTION_CLASS))) {            this->parseInteraction(current);        }        cur = cur->next ;    }    cur = prev ;}// ----------------------------------------------------------------------------//! Parse a routing spacevoidXmlParser::parseRoutingSpace(){    D[pdTrace] << "New Routing Space" << endl ;    DimensionHandle freeDimensionHandle = 1 ;    xmlNodePtr prev = cur ;    RoutingSpace current ;    current.setHandle(freeSpaceHandle++);    current.setName((char *) xmlGetProp(cur, ATTRIBUTE_NAME));    root->addRoutingSpace(current);    // Dimensions    cur = cur->xmlChildrenNode ;    while (cur != NULL) {        if ((!xmlStrcmp(cur->name, NODE_DIMENSION))) {            Dimension dimension(freeDimensionHandle++);            dimension.setName((char *) xmlGetProp(cur, ATTRIBUTE_NAME));            current.addDimension(dimension);        }        cur = cur->next ;    }    cur = prev ;}// ----------------------------------------------------------------------------//! is the XML parser available ?boolXmlParser::exists(){    return true ;}} // namespace certi#else // !HAVE_XMLnamespace certi {XmlParser::XmlParser(RootObject *){};RootObject *XmlParser::parse(string){    return 0 ;}bool XmlParser::exists(){    return false ;}} // namespace certi#endif // HAVE_XML// $Id: XmlParser.cc,v 3.16 2003/11/10 14:37:22 breholee Exp $

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -