您已經掌握了基本知識。你只關心三種情況:
- 開始標籤
- 結束標記
- 一切(忽略)
使用正則表達式查找開始&結束標記;請確保開始表達式排除斜槓作爲第二個字符。現在,製作一個簡單的堆棧:一個字符串列表將會執行。該列表將保存打開的標籤。
操作:
- 開始標籤:提取所述標籤(剝離角括號)。將它推到列表的前面。
- 結束標籤:提取標籤(去掉尖括號和斜槓)。檢查這個標籤是否與列表的前面相同。如果是這樣,彈出它。如果不是,請發出錯誤消息。如果列表中沒有任何內容,有人試圖在沒有任何打開時關閉標籤;發出消息。
- EOF:當您用完輸入時,請檢查列表。任何剩餘的字符串都是未封閉的標籤。發出消息。
請注意,這也可以讓你一些恢復的可能性。您可以掃描列表以查看無效的關閉標記是否與堆棧下方的某個東西匹配。這表示重疊塊。您可以尋找近距離匹配,暗示拼寫錯誤。如果您在沒有可能的情況下關閉,您可以發出消息並忽略它。這些步驟使您有機會發現多個錯誤。
哦,究竟發生了什麼......我已經做了足夠多次...
stack = []
with open("parse_test_1.txt", 'r') as parse_file:
for line in parse_file:
print "INPUT LINE:", line
ltag = line.find('<')
if ltag > -1:
rtag = line.find('>')
if rtag > -1:
# Found left and right brackets: grab tag
tag = line[ltag+1: rtag]
open_tag = tag[0] != '/'
if open_tag:
# Add tag to stack
stack.append(tag)
print "TRACE open", stack
else:
tag = tag[1:]
if len(stack) == 0:
print "No blocks are open; tried to close", tag
else:
if stack[-1] == tag:
# Close the block
stack.pop()
print "TRACE close", tag, stack
else:
print "Tried to close", tag, "but most recent open block is", stack[0]
if tag in stack:
stack.remove(tag)
print "Prior block closed; continuing"
if len(stack):
print "Blocks still open at EOF:", stack
哎,這聽起來很凌亂。是否有可能修改任何工具使用此文件,以便它可以使用真正的XML或JSON? – Chris
這是我們可以使用任何驗證器的初始目標,但是改變這是不可能的,因爲很多其他模塊都依賴於它。 – John
這很不幸。祝你好運! – Chris