2015-10-17 212 views
0

所以我需要這個程序能夠讀取一個看起來像XML的文本文件,並檢查它是否正確嵌套。如何使用堆棧格式化xml?

問題:如何使用堆棧檢查我的示例XML文件是否包含正確嵌套的標記?

class Stack: 
    def __init__(self): 
     self.items = [] 

    def isEmpty(self): 
     return self.items == [] 

    def push(self, item): 
     self.items.append(item) 

    def pop(self): 
     return self.items.pop() 

    def peek(self): 
     return self.items[len(self.items)-1] 

    def size(self): 
     return len(self.items) 



def xml_reader(filepath): 
    ops = Stack() 

    #Reads in file 
    with open(filepath, 'r') as f: 
     alist = [list(line.rstrip()) for line in f] 
    print(alist) 

    for element in alist: 
     if element == '<': 
      ops.push(element) 
    #Incomplete 
+1

我懷疑使用堆棧是不是你唯一的問題。您的後續評論表明您並不熟悉解析技術,例如自頂向下的遞歸下降解析,標記,解析器生成器等等。你不能期望通過提出SO問題來學習計算機科學的這個分支的全部內容:找到關於這個主題的好書。 –

回答

2

其基本思想是將每個開始元素推送到堆棧。當你到達結束元素標籤時,你應該從堆棧中彈出元素。如果元素名稱不匹配,或者在進程結束時堆棧不是空的,那麼你的xml結構不好。

蟒蛇是不是我的語言,但它應該是這樣的:

for element in alist: 
    if element.startsWith('<'): 
     //elmName = element.strip<> 
     ops.push(elmName) 
    if element.startsWith('</'): 
     //last = ops.pop 
     //elmName = element.strip</> 
     if(last != elmName) 
      'Invalid xml' 
//for loop end 
if(ops.length > 0) 
    'Invalid xml' 
+0

那麼我怎麼去把它翻譯成上面的代碼呢? – Jason

+0

@Jason,看看我更新的答案。 – DanielS

+0

因爲我正在逐字閱讀這個文件,所以我不能像「.startsWith」那樣做不幸的事情。 – Jason