SAX Parsing - отображение элемента HTML, который не принимает закрывающий тег - PullRequest
1 голос
/ 06 сентября 2011

Используя perl's XML :: SAX модуль, я анализирую (x) HTML-шаблоны, и в результате просто повторяю большую часть ввода для вывода. У меня есть обработчик событий SAX, который расширяет XML :: SAX :: Base и реализует обычные методы - start_element, end_element и т. Д.

Теперь мой вопрос касается элементов, которые не принимают закрывающий тег - например, <img />, <link /> и <input />. Парсер будет вызывать start_element($element_name, %attribute_hash) и end_element для этих тегов, но как мне узнать, что элемент является автономным?

Другими словами, я хочу выписать <img src="blah" /> так же, как <img ...></img> который я считаю недействительным.

Если не вести список этих элементов, что я могу сделать? Есть ли в SAX способ прямого отображения элемента вместо его восстановления из того, что было передано обработчикам событий?

Ответы [ 2 ]

3 голосов
/ 06 сентября 2011

Во-первых, основываясь на комментариях Квентина, вы используете парсер XML для обработки HTML.В этом нет ничего особенно плохого, если HTML-код относительно чистый.Однако, если вам нужно соблюдать HTML (в отличие от XHTML), то, возможно, XML-парсер является неправильным инструментом.

Если вы хотите взломать его, то вот что вы можете сделать.Реализуйте characters() обратный вызов, который установит флаг, если присутствуют какие-либо непробельные символы.Обратный вызов start_element() сбросит этот флаг.Обратный вызов end_element() будет считать тег пустым, если флаг не был установлен, и запишет синтаксис соответствующим образом.

Обратите внимание, что он также будет перехватывать теги типа <td></td>, преобразовывая их в <td />.

2 голосов
/ 06 сентября 2011

Если не вести список этих элементов, что я могу сделать?

Ничего: / обычно DTD поддерживает этот список, поэтому вы должны спросить объект dtd, прежде чем выдать endтеги ... но XML :: SAX, кажется, не поддерживает такую ​​вещь, так как он не поддерживает проверку

Другой вариант - сохранение состояния, поэтому вы знаете, когда элемент пуст, и опуская закрывающий тег,но это тоже отвратительно :) как ведение собственного списка

Есть ли в SAX способ прямого отображения элемента в противоположность его восстановлению из того, что передано обработчикам событий?

Нет,SAX не указывает такую ​​вещь, см. Нормативную / эталонную реализацию в Вывод файла XML с помощью SAX Parser

XML :: Twig, с другой стороны, обеспечивает это, см. Документы для

pretty_print => 'indented',                # output will be nicely formatted
empty_tags   => 'html',                    # outputs <empty_tag />

Вы хотите использовать XML :: Twig

...