错误的字符串表示

问题描述:

我对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

的问题是,写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]) 

答案在于格式行。该\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