Всегда лучше, если возможно, не заново открыть колесо. Существует несколько хороших инструментов, которые либо преобразуют HTML в правильно сформированный XML, либо действуют как XmlReader:
Вот три хороших инструмента:
TagSoup , программа с открытым исходным кодом, представляет собой инструмент на основе Java и SAX, разработанный John Cowan . Это
SAX-совместимый синтаксический анализатор, написанный на Java, который вместо синтаксического анализа правильно сформированного или корректного XML анализирует HTML так, как он встречается в дикой природе: плохой, неприятный и грубый, хотя довольно часто далеко не короткий. TagSoup предназначен для людей, которые должны обрабатывать эти вещи, используя некое подобие рационального дизайна приложения. Предоставляя интерфейс SAX, он позволяет применять стандартные инструменты XML даже к худшему HTML. TagSoup также включает в себя процессор командной строки, который читает файлы HTML и может генерировать либо чистый HTML, либо правильно сформированный XML, близкий к XHTML.
Taggle - это коммерческий порт C ++ TagSoup.
SgmlReader - это инструмент, разработанный Microsoft Крис Ловетт .
SgmlReader - это API XmlReader поверх любого документа SGML (включая встроенную поддержку HTML). Также предоставляется утилита командной строки, которая выводит правильно сформированный результат XML.
Загрузите ZIP-файл, включая автономный исполняемый файл и полный исходный код: SgmlReader.zip
Выдающимся достижением является чистый XSLT 2.0 парсер HTML , написанный Дэвидом Карлайлом .
Чтение его кода было бы отличным учебным упражнением для каждого из нас.
Из описания:
"* * д тысяча пятьдесят четыре: htmlparse (строка)
д: htmlparse (строка, пространство имен, HTML-режим)
Форма с одним аргументом эквивалентна)
d: htmlparse (строка, 'http://ww.w3.org/1999/xhtml',true()))
Разбирает строку как HTML и / или XML, используя некоторую встроенную эвристику, чтобы:
контроль подразумевает открытие и закрытие элементов.
Он не обладает полным знанием HTML DTD, но имеет полный список
пустые элементы и полный список определений сущностей. HTML-сущности и
все десятичные и шестнадцатеричные ссылки на символы принимаются. Примечание html-лица
распознаются, даже если html-mode = false ().
Имена элементов в нижнем регистре (если html-mode имеет значение true ()) и помещаются в
пространство имен, указанное в параметре пространства имен (которое может быть "" для обозначения
no-namespace, если у входа нет явных объявлений пространства имен, в
в этом случае они будут выполнены.
Имена атрибутов в нижнем регистре, если html-mode = true ()"
Более подробное описание здесь .
Надеюсь, это помогло.
Приветствия
Димитр Новатчев.