HtmlAgilityPack:誰かがHtmlDocument OptionAutoCloseOnEndをtrueに設定することの効果を正確に説明できますか?

c# html-agility-pack

質問

現在のドキュメンテーションには次のよう

クローズされていないノードのクローズを、最後か文書内で直接行う必要があるかどうかを定義します。これをtrueに設定すると、ブラウザがページをどのようにレンダリングするかを実際に変更することができます。デフォルトはfalseです。

申し訳ありませんが、私はこの段落を理解していないことを認めなければなりません。特に "最後に"何の?そして、「文書の中で」は正確に何を意味していますか?最後のものの前のフレーズは不愉快に聞こえる。オプションがtrueに設定されていて、htmlが適切にフォーマットされていれば、これはまだ文書に影響しますか?

私はソースコードを調べましたが、何が起こっているのか理解できませんでした。コードは本当に設定されていないプロパティに反応します。参照HtmlNode.csを私も中にいくつかのファンキーコード見つかっライン1707 - 、およびOptionAutoCloseOnEndを検索HtmlWeb.csをソースコードブラウザは行番号を示すが、ページ内のOptionAutoCloseOnEndを検索しませんあまりにも悪いライン1113と1154で。

このオプションが何をしているかの例を説明してください。

私はいくつかの悪いhtmlを修正し、ページのコンテンツをxmlにエクスポートするためにHtmlAgilityPackを使用しています。

ひどくフォーマットされた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を設定すると、何とか修正されます。私は、このプロパティを文書の構造の中で本当にtrueに設定することの効果が正確に何であるかを理解しようとしています。

ここで私が使用している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