我编写了一些代码来解析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会将一个字符区域作为几个片段处理?和回调几次?
答案 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)
相同的内容;这两种结构在错误消息和调试时非常有用。