簡體   English   中英

使用鏈接列表實現堆棧類以驗證xml文件

[英]implementing stack class using link list to validate xml file

使用鏈接列表實現您的Stack類。 使用您的堆棧類來驗證XML文件。 編寫C ++程序以從命令行讀取XML文件,並驗證與大小寫無關的開始和結束標記匹配的XML。 向所有缺少的相應開始或結束標記提供錯誤消息,然后繼續驗證所有XML文件。

糾正XML文檔的示例。

<Students>
    <Student>
        <Name>Tanver</Name>
        <RollNo>312</RollNo>
    <student>
<students>

錯誤的XML文檔示例,缺少“ head”和“ html”結束標記。 “名稱”開始標簽丟失。

<html>
    <head>
        <title>My first page</title>
        </name>
<body>
    My first page
</body>

我也在培訓C ++,並認為這是一個不錯的練習。 這是我想出的:

#include <iostream>
#include <vector>
#include <string>
#include <regex>

using namespace std;

template <typename T>
class Item {
    public:
        T data;
        Item *prev;
        Item(T& data, Item *prev) : data(data), prev(prev) {}
};

template <typename T>
class StackIterator {
    public:
        Item<T> *curr;

        StackIterator(Item<T> *curr) : curr(curr) {}

        T& operator*() { 
            return curr->data;
        }

        StackIterator<T>& operator++() {
            curr = curr->prev; 
            return *this; 
        }

        friend bool operator!=(const StackIterator<T>& l, const StackIterator<T>& r) {
            return l.curr != r.curr;
        }
};

template <typename T>
class Stack {
    typedef StackIterator<T> iterator;

    public:
        Item<T> *last=NULL;

        T& back(void) {
            return last->data;
        }

        void push_back(T d) {
            last = new Item<T>(d, last);
        }

        void pop_back(void) {
            Item<T> *curr = last;
            last = last->prev;
            delete curr;
        }

        ~Stack() {
            while (last) pop_back();
        }

        iterator begin() {
            return iterator(last);
        }

        iterator end() {
            return iterator(NULL);
        }
};

int main() {
    string xml[] = {"<Students>", "<Student>", "<Name>", "Tanver", "</Name>",
        "<RollNo>", "312", "</RollNo>", "</Student>", "</Students>"};

    //string xml[] = {"<html>", "<head>", "<title>", "My first page", "</title>",
    //    "</name>", "<body>", "My first page", "</body>"};

    regex opentag("^<(.*)>$");
    regex closetag("^</(.*)>$");
    smatch m;

    Stack<string> v;
    //vector<string> v;

    for (auto& it : xml) {
        if (regex_search(it, m, closetag)) {
            for (auto& x : m)
                if (x == v.back()) {
                    v.pop_back();
                    cout << "closing " << x << "\n";
                } else {
                    cout << "Tag " << x << " was not opened\n";
                }
        } else if (regex_search(it, m, opentag)) {
            for (auto &x : m) {
                cout << "opening " << x << "\n";
                v.push_back(x);
            }
        } else {
            cout << "data: " << it << "\n";
        }
    }

    for (auto& x : v) {
        cout << "Tag " << x << " was not closed\n";
    }
}

我沒有理會命令行部分的內容。 當然,也可以跳過整個StackIterator內容,但這就像我通常用純C語言編寫整個內容一樣。

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM