Attribute Parser

Sort by

recency

|

471 Discussions

|

  • + 2 comments

    include

    include

    include

    using namespace std;

    class HRML_Tag { public: void PrintValue(string iQuery) ; void SetTagAttrInfo(string iTagStr);

    vector<string> _listTag ;
    unordered_map<string, string> _mapAttrVal;
    

    };

    void HRML_Tag::SetTagAttrInfo(string iTagStr) { if(iTagStr.size() < 2) return;

    if(iTagStr[1] == '/')
    {
        _listTag.pop_back();
    }
    else
    {
        size_t pos_first_space = iTagStr.find_first_of(" ");
        if(pos_first_space == string::npos) 
        {
            _listTag.push_back(iTagStr.substr(1, iTagStr.size()-2));
            return;
        }
        string new_tag = iTagStr.substr(1, pos_first_space-1);
        _listTag.push_back(new_tag);
        int cnt = 0;
        string tags = "";
        while (cnt < _listTag.size()) 
        { 
            tags += _listTag[cnt];
            cnt++;
        }
    
        cnt = pos_first_space;
        string strAttr = "";
        string strValue = "";
        bool bAttr = true;
        int cntComma = 0;
        while (cnt < iTagStr.size()-2) 
        {
            cnt++;
            if(iTagStr[cnt] == ' ' || iTagStr[cnt] == '=') continue;
            else if(iTagStr[cnt] == '"') 
            {
                cntComma++;
                if(cntComma%2 == 0) 
                {
                    bAttr = true;
                    _mapAttrVal[tags + strAttr] = strValue;
                    strAttr = "";
                    strValue = "";
                }
                continue;
            }
    
            if(cntComma%2 !=0) bAttr = false;
    
            if(bAttr) strAttr += iTagStr[cnt];
            else strValue += iTagStr[cnt];
        }
    }
    

    }

    void HRML_Tag::PrintValue(string iQuery) { string query = ""; for(int i=0; i

    if(_mapAttrVal.find(query) != _mapAttrVal.end()) cout << _mapAttrVal[query] << endl;
    else cout << "Not Found!" << endl;
    

    }

    int main() { int N, Q; cin>>N>>Q; HRML_Tag tagObj ; cin.ignore(numeric_limits::max(), '\n'); for(int i=0; i

    for(int i=0; i<Q; i++)
    {
        string str = "";
        getline(cin, str);
        tagObj.PrintValue(str);
    }
    return 0;
    

    }

  • + 0 comments
    #include <cmath>
    #include <cstdio>
    #include <vector>
    #include <iostream>
    #include <map>
    #include <algorithm>
    #include <utility>
    #include <string>
    
    using namespace std;
    
    string getWord(string::iterator& startWordIterator, string::iterator& endIterator){
        string word {};
        startWordIterator = find_if(startWordIterator, endIterator, [](char character){
            return character != ' ' && character != '=' && character != '\"' && character != '>' && character != '<' && character != '~';
        });
    
        auto endWordIterator = find_if(startWordIterator, endIterator, [](char character){
            return character == ' ' || character == '=' || character == '\"' || character == '>' || character == '<' || character == '~';
        });
    
        if(startWordIterator == endIterator){
            return "";
        }
    
        copy(startWordIterator, endWordIterator, back_inserter(word));
    
        startWordIterator = endWordIterator;
        return word;
    }
    
    map<string, string> getAttributesFromLineIterator(string::iterator& startWordIterator, string::iterator& endIterator){
        map<string, string> attributesAndValue {};
        string attribute, value;
    
        while((attribute = getWord(startWordIterator, endIterator)) != ""){
            value = getWord(startWordIterator, endIterator);
            attributesAndValue[attribute] = value;
        }
    
        return attributesAndValue;
    }
    
    void findAndPrint(map<string, map<string, string>>& hrmlStructure, string& line){
        auto startWordIterator = line.begin();
        auto lineEndIterator = line.end();
    
        string tag, attribute;
        tag = getWord(startWordIterator, lineEndIterator);
        attribute = getWord(startWordIterator, lineEndIterator);
    
        auto tagIter = hrmlStructure.find(tag);
        if(tagIter == hrmlStructure.end()){
            cout << "Not Found!" << endl;
            return;
        }
    
        auto attribIter = (*tagIter).second.find(attribute);
        if(attribIter == (*tagIter).second.end()){
            cout << "Not Found!" << endl;
            return;
        }
        
        cout << (*attribIter).second << endl;
    }
    
    string getTagPathFromStack(vector<string>& tagStack){
        string tagPath {};
        auto tagIterator = tagStack.begin();
        tagPath.append(*tagIterator++);
    
        for(; tagIterator != tagStack.end(); ++tagIterator){
            tagPath.push_back('.');
            tagPath.append(*tagIterator);
        }
    
        return tagPath;
    }
    
    int main() {
        map<string, map<string, string>> hrmlStructure {};
        vector<string> tagStack {};
        string::iterator startWordIterator;
        string::iterator endWordIterator;
        
        int N {0}, Q {0};
        cin >> N >> Q;
    
        string line {};
        getline(cin, line);
        
        for(int i = 0; i < N; ++i){
            getline(cin, line);
    
            startWordIterator = line.begin();
            endWordIterator = line.end();
    
            string tag = getWord(startWordIterator, endWordIterator);
            if(tag[0] == '/'){
                tagStack.pop_back();
            }
            else{
                map<string, string> attributes = getAttributesFromLineIterator(startWordIterator, endWordIterator);
                tagStack.push_back(tag);
                string tagPath = getTagPathFromStack(tagStack);
                hrmlStructure[tagPath] = attributes;
            }
        }
        
        for(int i = 0; i < Q; ++i){
            getline(cin, line);
            findAndPrint(hrmlStructure, line);
        }
        
        return 0;
    }
    
  • + 0 comments

    include

    include

    include

    include

    include

    include

    include

    using namespace std;

    int main(){ int num_of_lines{0}, num_of_queries{0}; stack lines; map new_map;

    cin >> num_of_lines >> num_of_queries;
    cin.ignore();
    
    string link_tag;
    for(int i{0}; i < num_of_lines; i++){
        string new_tag;
        getline(cin, new_tag);
        if (new_tag[1] == '/'){
            string temp = lines.top();
            lines.pop();
            link_tag = link_tag.substr(0, link_tag.size() - temp.size());
        }else{
            int num_equal = count(new_tag.begin(), new_tag.end(), '=');  
            if ( num_equal == 0){
                string name_tag = new_tag.substr(1, new_tag.size() - 2);
                lines.push(name_tag);
                link_tag += name_tag;
                continue;
            }
            int index_first_space = new_tag.find(' ');
            string name_tag = new_tag.substr(1, index_first_space - 1);
            lines.push(name_tag);
            link_tag += name_tag;
            new_tag.erase(0, index_first_space + 1);
            new_tag.erase(new_tag.size() - 1, 1);
            while (num_equal){
                int index_first_euqal = new_tag.find('=');
                string attribute = new_tag.substr(0, index_first_euqal -1);
                new_tag.erase(0, index_first_euqal + 3);
                // cout << "current tag: " << new_tag << '\n';
                int index_first_mark = new_tag.find("\"");    
                string value = new_tag.substr(0, index_first_mark);
                new_tag.erase(0, index_first_mark+2);       
                // cout << "current tag: " << new_tag << '\n';  
                new_map[link_tag + attribute] = value;
                num_equal--;
            }
        }
    }
    vector<string> queries(num_of_queries);
    for (int i{0}; i < num_of_queries; i++){
        string new_tag;
        getline(cin, new_tag);
        while(count(new_tag.begin(), new_tag.end(), '.')){
            int index_dot = new_tag.find('.');
            new_tag.erase(index_dot, 1);
        }
        int index_attri = new_tag.find('~');
        new_tag.erase(index_attri, 1);
        queries[i] = new_tag;
    }
    for (int i{0}; i < num_of_queries; i++){
        if (new_map.find(queries[i]) != new_map.end()){
            cout << new_map[queries[i]] << '\n';
        }else{
            cout << "Not Found!" << '\n';
        }
    
    }
    return 0;
    

    }

  • + 0 comments

    Thank you for sharing this wonderful post. I really like it—it’s truly excellent!

  • + 0 comments

    Awesome! This post is very informative and effective. I found exactly what I was looking for. Thank you!