Attribute Parser

内容:


说明:

通过输入的xml信息,查找对应的值

示例代码:

// Attribute_Parser.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <map>
#include <sstream>
#include <iostream>
using namespace std;

/*
sample input
4 3
<tag1 value = "HelloWorld" >
<tag2 name = "Name1">
< / tag2>
< / tag1>
tag1.tag2~name
tag1~name
tag1~value
-----------------------------
sample output
Name1
Not Found!
HelloWorld
*/

//by rwan7727
int main()
{
    int n, q;
    cin >> n >> q;
    cin.ignore();

    map <string, string> attributeDB; // to store attribute-value pairs
    string inputstr, tag_preamble = "";

    // get each HRML line
    for( int i = 0; i < n; i++ )
    {
        getline( cin, inputstr );

        // for each HRML line, break it up into token words
        stringstream ss( inputstr );
        string word, attribute, value;
        size_t pos;

        while( getline( ss, word, ' ' ) ) // for each token word
        {
            // tag detected -> adjust tag_preamble by +/- tag
            if( word[0] == '<' )
            {
                string tag;

                if( word[1] == '/' )  // it's tag closing
                {
                    tag = word.substr( 2 );
                    tag = tag.substr( 0, tag.length() - 1 ); // rid of ">"
                    pos = tag_preamble.find( "." + tag );

                    if( pos == string::npos )
                        tag_preamble = "";
                    else
                        tag_preamble = tag_preamble.substr( 0, pos );
                }
                else   // it's tag opening
                {
                    tag = word.substr( 1 );

                    if( tag.find( ">" ) != string::npos )
                        tag = tag.substr( 0, tag.length() - 1 ); // rid of ">"

                    if( tag_preamble == "" )
                        tag_preamble = tag;
                    else
                        tag_preamble = tag_preamble + "." + tag;
                }
            }
            // value detected
            else if( word[0] == '"' )
            {
                pos = word.find_last_of( '"' );
                value = word.substr( 1, pos - 1 );
                attributeDB[attribute] = value; // insert into DB
            }
            // attribute name detected
            else if( word[0] != '=' )
            {
                attribute = tag_preamble + "~" + word;
            }
        }
    }

    // now we process the queries
    for( int i = 0; i < q; i++ )
    {
        getline( cin, inputstr );

        if( attributeDB.find( inputstr ) == attributeDB.end() )
            cout << "Not Found!" << endl;
        else
            cout << attributeDB[inputstr] << endl;
    }

    system( "pause" );
    return 0;
}


知识点:

1、使用map实现

2、string相关函数使用:substr(截取)、find_last_of(查找)

猜你喜欢

转载自blog.csdn.net/zhao3132453/article/details/80091519