2016-11-03 3 views
6

現在のドキュメントは言う:HtmlAgilityPack:誰かがHtmlDocument OptionAutoCloseOnEndをtrueに設定した場合の影響を正確に説明できますか?

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

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

私はソースコードを調べましたが、何が起こっているのかわかりませんでした。コードはtrueに設定されていないプロパティに反応します。 HtmlNode.csを参照してOptionAutoCloseOnEnd - 1707行目を検索してください。HtmlWeb.csの1113行目と1154行目にもファンキーなコードがあります。ソースコードブラウザでは行番号が表示されませんが、ページのOptionAutoCloseOnEndを検索してください。

このオプションの機能の例を説明してください。

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

ひどくフォーマットされたhtmlオーバーラッピングタグがいくつか出てきました。スニペットは次のとおりです。

最初のpタグは閉じず、重なっているSTRONGタグに注意してください。

OptionAutoCloseOnEndを設定すると、何とか修正されます。私は、このプロパティを文書の構造の中で本当にtrueに設定することの効果が正確に何であるかを理解しようとしています。ここで

は、私が使用していますC#のコードです:

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

ありがとうございました!

答えて

3

現在のコードは、親ノードが閉じられる直前に閉じられていないノードを常に閉じます。この(親<x>が閉鎖される前に閉じられていない<y>が閉じられている)

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

もともと、セットは、これを生成することができるように意図されたオプション、したがって、次のコード

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

意志出力代わりに(ではないXML出力タイプ用):文書の最後に決算<y>セットで

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

(つまり、「終了」何を意味しますs)。この場合、重複する要素を取得することができます。

この機能は、過去にどこかで壊れていたことを認めているかもしれませんが、理由はわかりません。

ノート<p>タグケースは、デフォルトでカスタムHtmlElementFlagによって管理されているため、特別です。これがHtmlNode.csで宣言された方法です。

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

ありがとうございます。 OptionAutoCloseOnEnd = falseのとき、閉じられていないpは、別の兄弟pを見つけたときに閉じるか、親が閉じたときだけ閉じますか?特定のタグのコードでその区別をしていますか?また、開始タグのない終了タグが見つかった場合はどうなりますか?それは捨てられますか? – costa

+0

はい対応するオープニングなしの終了タグ(おそらくエラーフィールドがある)が破棄されます。タグは、(HtmlNode.csの)定義されたElementFlagsに関して特別な方法でのみ扱われます。 –

1

開き、必要なプログラムでどこ近いタグと設定することであろうHtmlAgilityPackを使用するためのより良い方法:

doc.OptionAutoCloseOnEnd = false; 

あなたに期待される書式設定を行います。

そうしないと、ライブラリはクローズされていないタグをチェックし、コード実行フローごとに適切であると感じる場所で閉じます。

関連する問題