2016-02-11 63 views
1

我對Python非常非常新,我想我可以做一個簡單的應用程序來爲我解析XML格式。問題是,它幾乎看起來像從element.getElementsByTagName()方法中得到無效元素。我將在下面附上所有相關的源代碼。錯誤的字符串表示

嘗試格式化從XML捕獲的數據時出現問題;錯誤代碼如下:

Traceback (most recent call last): 
     File "C:/development/xml2dnf/main.py", line 8, in <module> output_file.write(str(result)) 
     File "C:\development\xml2dnf\Shotsheet.py", line 18, in __str__ reply += str(shot) + "\n" 
     File "C:\development\xml2dnf\StaticShot.py", line 19, in __str__ self.rect[2], self.rect[3]) 
ValueError: unexpected '{' in field name 

我嘗試,直到我想,這種錯誤可能不會在那裏鼓搗報道問題的行。當我上升到我的層次結構時,我注意到如果我告訴我的一個類到而不是解析我發送給它的特定列表,它幾乎按預期工作。當我不解析上述內容時,這個錯誤神奇地消失了。

認爲我的一對類是我的問題,我去了他們,並盡我所能找到一個緩解那個流浪'{'。我沒有發現任何問題。

我試圖排除故障,直到xml本身。我打印它,它看起來沒問題。但是,當我打印出應該得到的結果時,我注意到它會打印一些奇怪的無效值,然後打印出應該得到的錯誤不應出現的情況。

我做了一些Google搜索,但在這個問題上我找不到什麼。無論我能找到什麼都不能緩解我的問題或者是無足輕重的。我已經用盡了我的故障排除,同時也考慮到我對這門語言很陌生。


UPDATE:

與XML亂搞後,我注意到,無效元素是我不理解怎麼getElementsById工作的結果。該方法返回全部帶有ID的元素,而不僅僅是那些元素的直接子元素。調整實施解決了這個問題。

現在我明白了,我仍然遇到上述錯誤。我能想到的唯一的事情是我的課程的實施__str__是錯誤的,但我仍然看不到。單獨打印每一個參數都會產生預期的結果,但使用__str__會失敗,並且錯誤不會以任何可能的方式進行。

爲了說明的緣故,這裏的解釋說,編碼是錯誤的:

def __str__(self): 
     reply = "ShotData\x7Bid = {0} rect = ({1}, {2}, {3}, {4}) ".format(self.index, self.rect[0], self.rect[1], 
                      self.rect[2], self.rect[3]) 
     if self.render != 'ALPHA': 
      reply += "render = {0} ".format(self.render) 

     if self.collision >= 0: 
      reply += "collision = {0} ".format(self.collision) 

     if self.fixed_angle: 
      reply += "fixed_angle = true angular_velocity = {0}\x7D".format(self.angular_velocity) 

     delay_string = str(self.delay_color) 
     reply += "delay_color = {0} ".format(delay_string) 

     return reply 

代碼調用它:

def __str__(self): 
     reply = "#UserShotData\n\nshot_image = {0}\ndelay_rect=({1}, {2}, {3}, {4})\n\n" 

     for shot in self.shot_array: 
      reply += str(shot) + "\n" 

     delay_x1 = self.delay_rect[0] 
     delay_y1 = self.delay_rect[1] 
     delay_x2 = self.delay_rect[2] 
     delay_y2 = self.delay_rect[3] 

     return reply.format(self.shot_image, delay_x1, delay_y1, delay_x2, delay_y2) 

而且,要求的字符串表示的指令:

output_file.write(str(result)) 

一如既往,任何有關這個問題的幫助將不勝感激。

+2

這裏有太多的代碼。你能把它減少到一個能證明問題的最小例子嗎? – larsks

+0

@larsks我已經及時更新了問題,因爲錯誤的性質已經轉移。我也將所顯示的代碼量降至最低。 – Magnaillusion

回答

2

的問題是,寫ShotData\x7Bid是完全一樣的書寫ShotData{Bid,使用轉義序列在這裏不會造成.format治療花括號什麼不同。如果你想擺脫大括號,你需要加倍:

reply = "ShotData{{id = {0} rect = ({1}, {2}, {3}, {4}) ".format(self.index, self.rect[0], self.rect[1], self.rect[2], self.rect[3]) 
0

答案在於格式行。該\x7B字符打破它。如果你想在一個格式化的字符串中插入大括號,我建議你之後做:

reply = "{0} rect = ({1}, {2}, {3}, {4}) ".format(self.index, self.rect[0], self.rect[1], self.rect[2],self.rect[3]) 
reply = "ShotData{Bid = " + reply