Attribute Parser

  • + 0 comments

    class Tag { public:

    vector< pair< string , string > > att;
    string title;
    string queryFormat;
    vector< Tag > children;
    bool closeTag;
    Tag(){}
    
    Tag(string s){
        s.erase(s.end() -1);
        s.erase(s.begin() ,  s.begin() + 1);   
        if (s[0] == '/')
        {
            closeTag = true;
            s.erase(s.begin() ,  s.begin() + 1);   
        }else{
            closeTag = false;
        }
    
        replace(s.begin() , s.end() , '=' , ' ');
        replace(s.begin() , s.end() , '\"' , ' ');
    
        stringstream ss (s);
        string key ;
        string val;
    
        ss>>title;
    
       while (ss)
        {
            ss>> key>>val;
            att.push_back(make_pair(key,val));
        } ;
        att.erase(att.end() -1 );
    }
    

    };

    int main(int argc, char const *argv[]) {

    int t , q;
    string line;
    getline(cin , line);
    istringstream input(line);
    input>>t>>q;
    vector<string> ta , qa;
    vector<Tag> tags;
    
    for (int i =0 ; i< t; i++) {
        string temp;
        getline(cin , temp);
        ta.push_back(temp);
    }
    
    for (int i =0 ; i< q; i++) {
        string temp;
        getline(cin , temp);
        qa.push_back(temp);
    }
    
    for (int i =0 ; i< ta.size(); i++) {
        Tag tag = Tag(ta[i]);
    
        tags.push_back(tag);
    }
    
    vector<string> currentParents;
        map<string , string> tagsQuires;
    
    for (int i =0 ; i< tags.size(); i++) {
        if (!tags[i].closeTag)
        {
        currentParents.push_back(tags[i].title);
        }
    
        for (int j = i+1 ; j < (tags.size() - (i + 1)); j++)
            {
                if (tags[j].title != tags[i].title )
                {
                    if (!tags[j].closeTag)
                    {
                     tags[i].children.push_back(tags[j]);
                    }
                }else{
    
                    j = tags.size();
                }   
            }
    
            if ( tags[i].closeTag )
                {
                    currentParents.erase(currentParents.end()-1);
                    // for (int k = 0; k < currentParents.size(); k++)
                    // {
                    //     cout<<currentParents[k]<<" ";
                    // }
                    // cout<<currentParents.size()<<" for "<<tags[i].title<<endl;
                    if (currentParents.size()> 0)
                    {
                        for (int l = 0; l < currentParents.size(); l++)
                        {
                            tagsQuires[tags[i].title] += (currentParents[l] +'.');
                        }
                        tagsQuires[tags[i].title] +=    tags[i].title;
                    }else{
                        tagsQuires[tags[i].title] =    currentParents[0];
                    }   
                }
    
         }
    
    
     for (auto i = tags.begin(); i != tags.end();
         ++i) {
        if ((*i).closeTag) {
            tags.erase(i);
            i--;
        }
    }
    
    for (int i =0 ; i< qa.size(); i++) {
    
        stringstream ss (qa[i]);
    
        string query;
        string qf = qa[i];
    
        string tag;
        string value;
        string result = "";
    
       while (getline(ss, query , '.')){
       };
        replace(query.begin() , query.end() , '~' , ' ');
        replace(qf.begin() , qf.end() , '~' , ' ');
    
        stringstream ssQuery (query);
        stringstream ssf(qf);
    
        ssQuery>>tag>>value;
        ssf>>qf;
    
        for (int j = 0; j < tags.size(); j++)
        {
            if (tags[j].title == tag)
            {
                vector< pair<string , string> > m = tags[j].att;
                for (int k = 0; k < m.size(); k++)
                {
                    if (m[k].first == value)
                    {
                        result = m[k].second;
                    }               
                } 
            }   
        }
    
        if (result != "" && tagsQuires[tag] == qf)
        {
          cout<<result<<endl;
        }else{
          cout<<"Not Found!"<<endl;
        }
    
    }
    return 0;
    

    }