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

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

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

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

Я посмотрел в исходном коде, но я не понял, что происходит-код реагирует на свойство, которое не установлено в true. См.HtmlNode.cs, и поиск OptionAutoCloseOnEnd-line 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 не закрыт и обратите внимание на перекрывающийся сильный тег.

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

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

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

спасибо!

2 ответов


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

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> в конце документа (это то, что "конец" означает). Примечание в этом case, вы все еще можете получить перекрывающиеся элементы.

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

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

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

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

 doc.OptionAutoCloseOnEnd = false;

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

в противном случае библиотека будет проверять любые теги, которые не закрыты, и закрывать их везде, где это кажется подходящим в соответствии с вашим потоком выполнения кода.