2016-03-03 61 views
1

我有一個XML文件,但它不是XML或HTML。該文件的python如何檢查打開和關閉標記

例子:

<config-file> 
    name myconfig 
    date 3-2-2016 
</config-file> 
    <client> 
    <"ABC - CDE & 123"> 
    </"ABC - CDE & 123"> 
    </client> 

我們經常編輯這個文件,擾亂了打開或關閉。要麼不關閉,要麼錯過地點'<'或'>'。 試圖找到解析文件以確保它已打開和關閉的好方法。 我在想:

1循環直通每一行,並記錄其是否與 < + any characters >開始,並確保它具有關閉 </ + any characters>,如果沒有,它拋出圖案的錯誤。

任何幫助,歡迎。

+2

哎,這聽起來很凌亂。是否有可能修改任何工具使用此文件,以便它可以使用真正的XML或JSON? – Chris

+0

這是我們可以使用任何驗證器的初始目標,但是改變這是不可能的,因爲很多其他模塊都依賴於它。 – John

+0

這很不幸。祝你好運! – Chris

回答

1

您已經掌握了基本知識。你只關心三種情況:

  1. 開始標籤
  2. 結束標記
  3. 一切(忽略)

使用正則表達式查找開始&結束標記;請確保開始表達式排除斜槓作爲第二個字符。現在,製作一個簡單的堆棧:一個字符串列表將會執行。該列表將保存打開的標籤。

操作:

  • 開始標籤:提取所述標籤(剝離角括號)。將它推到列表的前面。
  • 結束標籤:提取標籤(去掉尖括號和斜槓)。檢查這個標籤是否與列表的前面相同。如果是這樣,彈出它。如果不是,請發出錯誤消息。如果列表中沒有任何內容,有人試圖在沒有任何打開時關閉標籤;發出消息。
  • 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 
+0

非常感謝您的幫助。這是很棒的東西。 – John