HtmlAgilityPack: Может ли кто-нибудь объяснить, что именно является результатом установки HtmlDocument OptionAutoCloseOnEnd в true?

c# html-agility-pack

Вопрос

В текущей документации говорится:

Определяет, нужно ли закрывать закрытые узлы в конце или непосредственно в документе. Установка этого значения в true может фактически изменить способ отображения страницы браузерами. Значение по умолчанию - false.

Извините, я должен признать, что я не понимаю этот абзац. В частности, «в конце» чего? И что означает «в документе»? Фраза до последнего звучит зловеще. Если для параметра установлено значение true, и если html отформатирован правильно, это все равно повлияет на документ?

Я посмотрел в исходном коде, но я не понял, что происходит - код реагирует на свойство, которое не установлено в true. См. HtmlNode.cs и поиск OptionAutoCloseOnEnd - строка 1707. Я также нашел некоторый фанковый код в HtmlWeb.cs в строках 1113 и 1154. Слишком плохо, что браузер исходного кода не показывает номера строк, а ищет OptionAutoCloseOnEnd на странице.

Не могли бы вы проиллюстрировать пример, что делает этот вариант?

Я использую HtmlAgilityPack, чтобы исправить плохой html и экспортировать содержимое страницы в xml.

Я столкнулся с некоторыми плохо отформатированными html-перекрывающимися тегами. Вот фрагмент:

<p>Blah bah
<P><STRONG>Some Text</STRONG><STRONG></p>
<UL>
<LI></STRONG>Item 1.</LI>
<LI>Item 2</LI>
<LI>Item 3</LI></UL>

Обратите внимание, что первый тег p не закрыт и обратите внимание на перекрывающий тег STRONG.

Если я установлю OptionAutoCloseOnEnd, это будет как-то исправлено. Я пытаюсь понять, что именно представляет собой эффект от установки этого свойства в целом в структуре документа.

Вот код C #, который я использую:

HtmlDocument doc = new HtmlDocument();
doc.OptionOutputAsXml = true;
doc.OptionFixNestedTags = true;      
//  doc.OptionAutoCloseOnEnd = true;    
doc.LoadHtml(htmlText);

Спасибо!

Принятый ответ

Текущий код всегда закрывает незамкнутые узлы непосредственно перед закрытием родительского узла. Итак, следующий код

var doc = new HtmlDocument();
doc.LoadHtml("<x>hello<y>world</x>");
doc.Save(Console.Out);

выведет это (незакрытый <y> закрывается до того, как родительский <x> закрыт)

<x>hello<y>world</y></x>

Первоначально опция, когда она была установлена, предназначалась для ее создания (а не для типов вывода XML):

<x>hello<y>world</x></y>

с закрытием <y> установленным в конце документа (это означает «конец»). Обратите внимание, что в этом случае вы все равно можете получить перекрывающиеся элементы.

Эта функция (может быть, бесполезная, я могу признать, что) была сломана где-то в прошлом, я не знаю почему.

Примечание. Случай тега <p> является особенным, так как по умолчанию он управляется пользовательским HtmlElementFlag. Вот как это объявлено в HtmlNode.cs:

ElementsFlags.Add("p", HtmlElementFlag.Empty | HtmlElementFlag.Closed);

Популярные ответы

Лучшим способом использования HtmlAgilityPack было бы открывать и закрывать теги программно там, где это необходимо, и устанавливать:

 doc.OptionAutoCloseOnEnd = false;

Это даст вам ожидаемое форматирование.

В противном случае библиотека проверит наличие каких-либо закрытых тегов и закроет их там, где это удобно, в соответствии с потоком выполнения кода.



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow