Jython与xml.sax解析器 - 奇怪的错误

0 投票
2 回答
648 浏览
提问于 2025-04-16 12:25

我刚开始学习Python/Jython和SAX解析器(xml.sax)。我写了一个简单的内容处理器来测试一下。

from __future__ import with_statement 

from xml.sax import make_parser, handler
from xml.sax.handler import ContentHandler

class CountingHandler(ContentHandler):

    def __init__(self):
        self.counter = 0

    def startElement(self, name, attrs):
        self.counter += 1

def main(argv=sys.argv):
    parser = make_parser()
    h = CountingHandler()
    parser.setContentHandler(h)
    with open(argv[1], "r") as input:
        parser.parse(input)

当我在一些文档上运行这个程序(不是所有文档),我遇到了一个错误:

Traceback (most recent call last):
  File "src/sciencenetworks/xmltools.py", line 93, in <module>
    sys.exit(main())
  File "src/sciencenetworks/xmltools.py", line 88, in main
    parser.parse(input)
  File "/amd.home/home/staudt/workspace/jython/Lib/xml/sax/drivers2/drv_javasax.py", line 141, in parse
    self._parser.parse(JyInputSourceWrapper(source))
  File "/amd.home/home/staudt/workspace/jython/Lib/xml/sax/drivers2/drv_javasax.py", line 90, in resolveEntity
    return JyInputSourceWrapper(self._resolver.resolveEntity(pubId, sysId))
  File "/amd.home/home/staudt/workspace/jython/Lib/xml/sax/drivers2/drv_javasax.py", line 75, in __init__
    if source.getByteStream():
AttributeError: 'unicode' object has no attribute 'getByteStream'

当我查看drv_javasax.py的源代码时,似乎输入没有被识别为一个文件对象,但实际上它是的。
有没有什么办法可以解决这个问题?

2 个回答

0

当你在你的 with 语句后面加上 print type(input) 这行代码时,你会看到什么?

如果你用老式的 "try/finally" 代码来代替 "with",这样做对所有文件都有效吗?

那些能正常工作的文件和那些不工作的文件有什么不同?

如果你把 input 这个名字换成一个不和内置函数冲突的名字,会发生什么?

1

我觉得这是一个错误:http://bugs.jython.com/issue1488。这个问题在 Jython 2.5.2-b1 版本中修复了:http://www.jython.org/latest.html

撰写回答