Jython и парсер xml.sax - странная ошибка - PullRequest
0 голосов
/ 23 февраля 2011

Я только начинаю работать с 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 ]

1 голос
/ 23 февраля 2011

Я думаю, что это ошибка: http://bugs.jython.com/issue1488. Исправлено в Jython 2.5.2-b1: http://www.jython.org/latest.html

0 голосов
/ 23 февраля 2011

Когда вы вставляете print type(input) после вашего оператора with, что вы видите?

Когда вы возвращаетесь к старому стилю «try / finally» вместо «with», он работает длявсе файлы?

Чем отличаются файлы, которые работают, и файлами, которые не работают?

Что произойдет, если вы измените имя input на что-то, что не затеняет встроенный файл?в функции?

...