SAX解析器如何处理字符?

时间:2011-03-22 08:38:55

标签: python xml

我编写了一些代码来解析XML文件,并希望打印它的字符,但每个字符似乎都会调用characters()三次回调函数。

代码:

def characters(self,chrs):
            if self.flag==1:
                    self.outfile.write(chrs+'\n')

xml文件:

<e1>9308</e1>
<e2>865</e2>

,输出如下,很多空行。


9308


865

我认为应该:

9308

865

为什么有空间线?我读了文档信息:

  

字符(自我,内容)

     

接收角色数据通知。   解析器将调用此方法来报告每个块   人物数据。 SAX解析器可能会返回所有连续的   单个块中的字符数据,或者它们可以将其拆分为   几个块; 然而,任何单个中的所有字符   事件必须来自同一个外部实体,以便   定位器提供有用的信息。

所以SAX会将一个字符区域作为几个片段处理?和回调几次?

3 个答案:

答案 0 :(得分:4)

您发布的示例XML显然不是完整的XML,因为它会格式错误(并且SAX解析器会告诉您而不是生成输出)。所以我假设XML的内容比你向我们展示的更多。

您需要注意,任何XML元素之间的每个空格都是字符数据。所以如果你有类似的东西:

<foo>
  <bar>123</bar>
</foo>

然后你有至少3个文本节点:一个包含"\n "(即一个换行符,两个空格字符),一个包含"123",最后但并非最不重要的另一个"\n"(即只是一个换行符。)

答案 1 :(得分:0)

  

所以SAX会将一个字符区域作为几个片段处理?和回调几次?

这显然发生在您的案件中 - 有任何疑问吗?

但是你的问题描述很差,因为你没有提到你正在使用的解析器。

答案 2 :(得分:0)

使用self.outfile.write(chrs+'\n')您无法确切了解发生的情况。

尝试self.outfile.write("Chrs: %r\n" % chrs)

查找内置函数repr() ... "%r" % foo生成与repr(foo)相同的内容;这两种结构在错误消息和调试时非常有用。