Поисковый движок Sphinx (sphinxsearch) при индексации ругается про "XML parse error: not well-formed". Нужна проверка синтаксиса XML

При индексации очередных данных через xmlpipe2 поисковый движок sphinxsearch (Sphinx) начал ругаться про "XML parse error: not well-formed". Работать с не до конца сформированными индексами он тоже отказался.

Вдобавок и место ошибки указывает как-то странно: номер строки и идентификатор документа ведут в разные места индексируемого файла xml (в конечном итоге оказалось, что правильнее ориентироваться на идентификатор документа).

Вырезание кусков из xml файла сдвигало место ошибки.

Просмотр индексируемого файла xml ничего подозрительного не выяснил.
Воспользовался помощью программы для проверки синтаксиса xml. Вот этой, описанной в habrahabr.ru/sandbox/37354/ плугин к Notepad++. Плугин называется XML Tools и скачивается автоматически менеджером плугинов из самого Notepad++.

Штука интересная и удобная, но мне не помогла, ибо она посчитала, что проблема в префиксе тега "sphinx:document".

Нашел в форуме Сфинкса вот эту мысль:
http://sphinxsearch.com/forum/view.html?id=1172
"Это установленный в системе libexpat отчего-то не осиливает, xmlpipe2 работает через него."

Из примеров к официальной документации языка программирования Python
по-быстрому был взят пример работы с expat:


import xml.parsers.expat

# 3 handler functions
def start_element(name, attrs):
    if name=="sphinx:document":
	print "begin ---------------------"
    print 'Start element:', name, attrs


def end_element(name):
    print 'End element:', name
    if name=="sphinx:document":
	print "end -----------------------"

def char_data(data):
    print 'Character data:', repr(data)

p = xml.parsers.expat.ParserCreate()

p.StartElementHandler = start_element
p.EndElementHandler = end_element
p.CharacterDataHandler = char_data

f = open("sphinx_index.xml", 'r')
p.ParseFile(f)

print "end of test expat"

Ну наконец-то - разбор файла оборвался внутри вполне конкретного тега. Смотрим внимательно. Строка внутри этого тега (название какой-то вещи) содержит символ "амперсанд" ( & ).

А в формате XML этот символ имеет специальное значение:

http://ru.wikipedia.org/wiki/XML#.D0.A1.D0.BF.D0.B5.D1.86.D1.81.D0.B8.D0...

Список подобных специальных символов не велик:
& amp; (&)
& lt; ( & gt; (>)
& apos; (')
& quot; (")

Поиск-замена "амперсандов" на сочетание "&" в индексируемом файле xml проблему решило.

Программисту, занимающемуся программой, которая генерирует проблемный индексируемый файл, соответствующее багофиксное задание отправлено...

Вывод:
Плохо, что сообщение об ошибке не очень внятное. Без специально написанной (см. выше) тестирующей программы очень трудно догадаться.

Компьютерные вопросы: 
2002-2012 ©