Я пытаюсь перебрать элементы XML-документа и запустить события для элементов «start» и «end».
Это довольно просто при использовании модуля Python lxml, и есть еще один вопрос относительно SO:
Использование Python xml.etree для поиска начальных и конечных смещений символов
#!/usr/bin/python
import re, sys
from lxml import etree
from StringIO import StringIO
dtd = etree.DTD (open (sys.argv [1], "r"))
xml = etree.XML (open (sys.argv [2], "r").read ())
result = dtd.validate (xml)
for error in dtd.error_log.filter_from_errors():
print(error.message)
print(error.line)
print(error.column)
if result == True :
for event, elem in etree.iterwalk (xml, events=('start', 'end')) :
if event == 'start' :
print 'starting element:', elem.tag
elif event == 'end' :
print 'ending element:', elem.tag
if elem is not xml :
print elem.tail
Я хотел бы сделать то же самое, используя библиотеку C ++ XML для tinyxml2, но мне пока не повезло с этим [в частности, поиск закрывающих тегов].
Я предпочитаю tinyxml2, поскольку он «крошечный», но я открыт для других библиотек C ++ XML, если они могут достичь этой цели (более легко).
Если есть лучший способ инициировать события в «конечных тегах», я также открыт для этого.
tinyXml2 предлагает очень простую (и очень быструю) реализацию для синтаксического анализа и навигации внутри структуры XML. RapidXML скорее всего быстрее, но у него такое же основное поведение.
Я рекомендую, если это обязательно обязательное событие перехвата (начало и конец), использовать Xerces, потому что SAXParser позволяет перехватывать, когда анализатор находится внутри элемента xml и когда он также выходит из элемента. Большим неудобством, по моему скромному мнению, является компиляция под MSVC, она чертовски утомительна, потому что вы должны скомпилировать Apache Commons в C ++, но в среде gcc я думаю, что сравнение тривиально. Удачи!