↑↑↓↓←→←→ⒷⒶ Войти !bnw Сегодня Клубы
А вопрос таков: есть ли для Питона парсеры XML, которые могли бы сохранять координаты XML-конструкций из исходного XML? SAX или DOM -- мне, по большому счёту, без разницы. Нужны координаты открывающих и закрывающих тегов, причём для каждого тега -- координаты начала и конца. xml.sax.handler.ContentHandler даёт, если от него наследоваться, только подмножество нужных событий. Куды податься?
Рекомендовали: @o01eg
#82SN7E / @dluciv / 3663 дня назад

я дунчь. даже делать объект-оберточку, которая будет по read() считать прочитанные байтики бесполезно -- StartElementHandler и EndElementHandler дергается когда парсер уже его прочитал
#82SN7E/GKK / @stiletto / 3663 дня назад
@stiletto Я юзал: self._locator.getLineNumber() self._locator.getColumnNumber() Это было целый грёбаный год назад, и я уже забыл, что они возвращали. Может быть конец тегов..., а я уже пытался по ним найти начала. Я не помню уже, но вот теперь грёбаный год прошёл и придётся вспомнить %/. В принципе, пусть он хоть 10 раз SAX, о не треснул бы запоминать и начало тега, пока не начал парсить то, что за концом тега встретил. А может есть какой DOM-парсер, который эту инфу сохраняет? Ему ж на ошибки как-то ругаться надо тоже, значит и смещения нужны. И что такое "дунчь"?
#82SN7E/Z8P / @dluciv --> #82SN7E/GKK / 3663 дня назад
@dluciv https://docs.python.org/2/library/pyexpat.html#xml.parsers.expat.xmlparser.CurrentByteIndex есть вот такое, если конец тега сойдет
#82SN7E/DSK / @stiletto --> #82SN7E/Z8P / 3663 дня назад
а можно узнать зачем это всё?
#82SN7E/SXT / @stiletto / 3663 дня назад
@stiletto В нулевом приближении: Есть тулза, которая ищет в тексте клоны. Но она на XML не рассчитана и ищет хер знает как. Тег или не тег, сбалансированы теги, или нет, закрыты ли строки, или нет -- ей до одного места это всё. Тем не менее, жизнь сложилась так, что тулза используется, и используется в частности, для DocBook. Тулза не моя, как и мотороллер, исходников нет. В котором хочется нарезать повторяющиеся куски, и их потом повторно использовать. Соответственно, сильно порушенный XML надо выбросить, а частично порушенный -- восстановить.
#82SN7E/AYO / @dluciv --> #82SN7E/SXT / 3663 дня назад
@stiletto Ну это примерно то же самое, что и я юзал, хотя CurrentByteIndex мне попроще будет. Т.е. придётся мне, бедному, похоже искать ближайший "<" слева, да? Да ещё если какой-нибудь мудила его в значение атрибута захреначит, то ещё и это проверять...
#82SN7E/LK3 / @dluciv --> #82SN7E/DSK / 3663 дня назад
@dluciv А, вспомнил. Мне надо `<тег ... ></тег>` от `<тег ... />` отличтать, вот чего... Вот это засада конечно.
#82SN7E/3EG / @dluciv --> #82SN7E/LK3 / 3663 дня назад
@dluciv Так, я похоже обосрался. CurrentByteIndex похоже возвращает старт тега! % cat test.py import xml.parsers.expat class Shit(object): def __init__(self, parser): self.p = parser self.pos = 0 p.StartElementHandler = self.start_element p.EndElementHandler = self.end_element p.CharacterDataHandler = self.char_data p.XmlDeclHandler = self.xml_decl def start_element(self, name, attrs): print '%d START:' % (self.pos,), name, attrs self.pos = self.p.CurrentByteIndex def end_element(self, name): print '%d END:' % (self.pos,), name self.pos = self.p.CurrentByteIndex def char_data(self, data): print '%d CDATA:' % (self.pos,), repr(data) self.pos = self.p.CurrentByteIndex def xml_decl(self, version, encoding, standalone): print '%d XML DECL:' % (self.pos,), version, encoding, standalone self.pos = self.p.CurrentByteIndex p = xml.parsers.expat.ParserCreate() s = Shit(p) p.Parse("""<?xml version="1.0"?> <parent id="top"><child1 name="paul">Text goes here</child1> <child2 name="fred">More text</child2> </parent>""", 1) % python2 test.py 0 XML DECL: 1.0 None -1 0 START: parent {u'id': u'top'} 22 START: child1 {u'name': u'paul'} 39 CDATA: u'Text goes here' 59 END: child1 73 CDATA: u'\n' 82 START: child2 {u'name': u'fred'} 83 CDATA: u'More text' 103 END: child2 112 CDATA: u'\n' 121 END: parent
#82SN7E/9W5 / @stiletto --> #82SN7E/LK3 / 3663 дня назад
@stiletto суть - в двух нолях вначале и 22 на старте child1, ибо len('<?xml version="1.0"?>')==21 (плюс \n)
#82SN7E/LM3 / @stiletto --> #82SN7E/9W5 / 3663 дня назад
@stiletto ну т.е. этот код бы работал если бы в CurrentByteIndex был конец тега (ну, забывая о том что в реальной ситуации понадобилось бы добавить хэндлеры еще на element declaration, doctype и т.п.), но не работает т.к. там начало и всё гораздо проще, просто берешь CurrentByteIndex и хуяришь
#82SN7E/HRD / @stiletto --> #82SN7E/LM3 / 3663 дня назад
@stiletto Ну на самом деле конец тега, зная начало, я тоже найду. Просто обидно всё делать руками, в то время как эта дура всё равно то же самое проделывает сама...
#82SN7E/H7N / @dluciv --> #82SN7E/HRD / 3663 дня назад
@stiletto А, оно ещё и комменты кажется дропает, говно эдакое, вот чего... Или я забыл что-то.
#82SN7E/3TI / @dluciv --> #82SN7E/HRD / 3663 дня назад
@dluciv на комменты отдельный хэндлер
#82SN7E/PQC / @stiletto --> #82SN7E/3TI / 3663 дня назад
@stiletto это уже лучше
#82SN7E/BHI / @dluciv --> #82SN7E/PQC / 3663 дня назад
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.