Разбор HTML-фрагментов с помощью libxml SAX - PullRequest
2 голосов
/ 14 мая 2010

Мне нужно разобрать фрагменты HTML, под которыми я подразумеваю, что в файлах отсутствуют элементы , и , в противном случае имеет правильно сформированный синтаксис XHTML, гарантируется кодировка UTF8. Похоже, что libxml идеально подходит для этой задачи, но у меня есть определенные ограничения, которые я просто не знаю, как реализовать.

  1. htmlSAXParseFile () выполняет свою работу достаточно хорошо, но, похоже, сам создает DOM, вставляя в процесс элементы body и html . Я хотел бы создать DOM сам, потому что мне может понадобиться пропустить некоторые элементы и изменить другие на лету. Можно ли как-то сказать libxml вообще не создавать DOM , а просто анализировать HTML и вызывать мои обработчики?
  2. Если это невозможно для libxml HTML-парсера, я мог бы также использовать xmlSAXUserParseFile (), который, кажется, не создает DOM. Однако, поскольку файлы имеют такую ​​структуру, как

    ...

    ...

    , синтаксический анализатор просто выплевывает «Дополнительное содержимое в конце документа» слишком рано. Есть ли способ подавления некоторых ошибок синтаксического анализа при получении уведомления о них (только потому, что никто не гарантирует, что в этих файлах никогда не будет других ошибок)?
  3. В libxml есть целая куча разбора функций, некоторые из которых принимают xmlParserOption в качестве параметра. Увы, xmlSAXUserParseFile () этого не делает. И те, которые все, кажется, создают DOM по некоторым не относящимся к делу причинам дизайна API. Я скучаю по очевидному кандидату?

О, и я признаюсь, что мое нежелание использовать DOM libxml выглядит как странность. Я чрезвычайно ограничен в ОЗУ, поэтому мне крайне необходим полный контроль над DOM, чтобы иметь возможность отбрасывать некоторые узлы в условиях нехватки памяти и перечитывать их при необходимости.

Заранее спасибо.

1 Ответ

6 голосов
/ 09 июня 2010

ОК, поскольку никто не ответил на вопрос, я постараюсь сделать это сам.

Я написал все обработчики начального / конечного элементов, и похоже, что libxml больше не создает DOM. По крайней мере, указатель на возвращаемый документ равен NULL. Он по-прежнему настаивает на html и элементах тела, но я могу жить с этим.

Одной из основных проблем является то, что libxml сохраняет все пробельные узлы, несмотря ни на что. Поэтому я должен проанализировать текстовое содержимое, чтобы устранить игнорируемые пробелы. Это некрасиво, но это работает. Стоит ли упоминать, что разбор UTF-8 - это то удовольствие, которое вы редко пропускаете?

Если честно, документация libxml ужасна. Мой совет всем, кто когда-либо пробовал читать документы: вместо этого читайте исходный код. Код гораздо удобнее для чтения и документирования.

Спасибо за внимание.

...