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;
что даст вам ожидаемое форматирование.
в противном случае библиотека будет проверять любые теги, которые не закрыты, и закрывать их везде, где это кажется подходящим в соответствии с вашим потоком выполнения кода.