Парсер Scala XML pull и местоположение

Меня попросили написать утилиту для поиска в большом количестве файлов XML элементов с отсутствующим атрибутом. Ответственный отдел не может просто сделать этот атрибут обязательным в DTD, потому что это приведет к поломке сотен файлов. Они хотят редактировать их вручную в течение нескольких дней/недель.

Я пишу небольшой инструмент командной строки в Scala 2.8.1. Я буду использовать синтаксический анализатор «pull», чтобы сохранить чистоту кода функционального программирования и запускать его в многопоточном режиме.

Мне нужно местоположение событий XML. API, предоставленный в Java 6 (javax.xml.stream. XMLStreamReader), имеет метод (getLocation()), который возвращает номер строки события. Я могу использовать это для написания сообщений, информирующих пользователя о том, где искать отсутствующий атрибут.

Я бы предпочел использовать синтаксический анализатор запросов в scala.xml.pull.XMLEventReader, но он, похоже, не предлагает информацию о местоположении.

Я что-то упускаю? Это где-то еще в Scala API?


person Ralph    schedule 19.04.2011    source источник
comment
возможный дубликат Как отслеживать исходную строку XML элемент?   -  person Daniel C. Sobral    schedule 19.04.2011
comment
Я поражен тем, как низко (оригинальный) дубликат этого вопроса находится в списке связанных ссылок. Я попробую отредактировать его заголовок, чтобы сделать его ближе.   -  person Daniel C. Sobral    schedule 19.04.2011
comment
Фу. Я не увидел, что исходный вопрос, как я думал, был полным загрузчиком XML, в то время как это касается чтения pull. Извиняюсь. Я бы отозвал свой голос, чтобы закрыть, если бы это было возможно.   -  person Daniel C. Sobral    schedule 19.04.2011
comment
Это не дубликат. Другой вопрос касается конкретно синтаксических анализаторов SAX - API для Locator ясен. Я пытаюсь использовать парсер Scala StAX. Я даже знаю, как это сделать в пакете javax.xml.stream, только не в версии scala.xml.pull.   -  person Ralph    schedule 19.04.2011


Ответы (1)


Насколько я вижу, это не предусмотрено XMLEventReader API.

Он зависит от io.Source и может предоставить доступ к местоположению, но не предоставляет. Я не вижу простого способа обойти это, поскольку объект, имеющий доступ к позиции, является закрытым.

Вы можете сделать собственную копию XMLEventReader, который создает пользовательский XMLEvent с позицией. Методом изменения будет override def elemStart, который имеет доступ к позиции и может генерировать еще один EvPos(line:Int, column:Int) после каждого EvElemStart.

Вы также можете рассмотреть возможность использования версии 2.9.RC1, так как были исправлены некоторые ошибки, связанные с производительностью.

person huynhjl    schedule 19.04.2011