解析乙個類似xml的字串

2021-09-26 02:15:06 字數 2538 閱讀 4985

這是乙個簡單的資料結構問題,本來以為這是中檔題,但是好像是高估它了,這個只能算是個簡單的問題。

問題是這樣的,程式會接收到乙個字串,需要實現用這個字串給乙個結構賦值,有點類似xml解析。

把過程記錄下來:

有乙個字串,字串中包含三種型別的資料資訊:陣列,結構,普通元素。

陣列用包起來,結構用{}包起來,普通元素以^結尾。真正的資訊只在普通元素裡面有,陣列和結構都是對普通元素的封裝。結構可以包含陣列,陣列也可以包含結構(其實陣列和結構在這裡的作用是一樣的)。

收到乙個這樣結構的字串:

]]},把這個字串展開就像下面這樣:

那麼從裡面抽象,其實這就是乙個大的結構,陣列和結構本身就是差不多的, 都是要包含普通元素,

array

普通元素包含資訊:

ele

資料結構一:

冗餘設計,把陣列和普通元素合併。

base

普通元素只有info中有值,陣列和結構中只有list中有值。那麼如何區分各個結構呢?自然可以通過讀取info和list判斷,但是這樣做不能區分陣列和結構。

那再加乙個標誌符吧,最後得到的結構如下:

base

那麼大概怎麼搞呢?

解析肯定是要用到堆疊的,棧頂儲存的結構或者陣列一定是包含了當前解析到的位置的普通元素,結構,或者陣列。

如果當前是普通元素,用普通元素生成乙個base物件,放入棧頂陣列(或結構)的list中。

如果當前是結構,那麼生成乙個base物件**棧,繼續處理接下的字元。

讀取到結構結束標誌符時,說明這個結構已經處理完了,從棧中取出該物件,放入上級物件的list中。

陣列的處理也是同樣的方法。

程式執行示意圖如下:

為了檢驗結構對不對,把結果輸出看一下。

輸出實現想法:

1.輸出也是類似的,如果遇到結構,那麼就將結構壓棧,並列印

7.乙個陣列的list遍歷完,出棧,列印]

在示例**中,給出乙個遞迴的實現,示例**如下:

#include #include #include #include #include ///----tag

const char end_elem = '^';

const char begin_cbo = '';

const char begin_array = '[';

const char end_array = ']';

///---end tag

struct cbodata_type

std::string elem;

char tag;

std::vectordata;

void init(const std::string& cbo_raw_data);

void printinfo(const cbodata_type& cbo);

void printinfo();

};void cbodata_type::printinfo(const cbodata_type& cbo)

printf("]\n");

} else if (cbo.tag == begin_cbo)

printf("}\n");

} else }

void cbodata_type::printinfo()

}void cbodata_type::init(const std::string& cbo_raw_data)

case end_elem:

case begin_array:

case end_array:

case end_cbo:

else

break;

} default:

} }}

int main()

; cbodata_type cbo;

cbo.init(test);

printf("\ncbo:\n");

cbo.printinfo();

return 0;

}

談一談這個問題的總結:

這個問題其實和遞迴搜尋問題很相似,當前節點的任務還沒有處理完,就必須要進行下乙個節點任務的處理,遞迴是個比較自然的想法。

解遞迴的套路就是在當前節點沒有處理完就要進入下乙個節點任務時儲存當前的節點。越後儲存的越先處理。資料結構中的棧恰好符合這一要求。

與此類似的還有遍歷資料夾的問題,普通檔案相當於這裡的普通元素,資料夾相當於陣列結構。

xml解析也是一樣的,只是其中的標誌***更為複雜,xml解析就不要往遞迴想了。

字串的乙個操作 替換類似陣列字串中的項

using system using system.data using system.configuration using system.collections using system.web using system.web.security using system.web.ui usin...

字串的乙個操作 替換類似陣列字串中的項

using system using system.data using system.configuration using system.collections using system.web using system.web.security using system.web.ui usin...

xml檔案 字串解析

解析xml字串,如下 public static void main string args catch exception e 解析xml檔案,xml檔案如下 aaa 學校 13728704450 男,1958年出生 bbbyyy學校 1372sadgasg4450 男,1968年出生,出生地長沙...