Attribute Parser

Sort by

recency

|

470 Discussions

|

  • + 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!

  • + 0 comments

    Wonderful post! It’s engaging and full of valuable information. Thank you for sharing!