質問

HtmlAgilityPackを使用しています。次の文字列を使用してHtmlDocumentとLoadHtmlを作成します。

<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One</option><option value="2">Two</option></select>

これはいくつかの予期しないことを行います。まず、EndTagNotRequiredという2つのパーサーエラーが発生します。次に、選択ノードには4つの子があります。2つはオプションタグ用で、2つはオプションタグの内部テキスト用です。最後に、OuterHtmlは次のようになります。

<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One<option value="2">Two</select>

したがって、基本的に、オプションに終了タグをドロップすることを決定しています。それを行うのが適切で望ましいかどうか、少しの間お任せしましょう。 HtmlAgilityPackを使用してHTML生成コードをテストしているので、HTMLが実際に不正な形式でない限り、HtmlAgilityPackを使用して決定を下したり、エラーを表示したりしたくありません。私が望むように動作させる方法はありますか?具体的には、HtmlDocumentのいくつかのオプションを設定してみました:

 doc.OptionAutoCloseOnEnd = false;
 doc.OptionCheckSyntax = false;
 doc.OptionFixNestedTags = false;

これは機能していません。 HtmlAgilityPackが私が望むことをできない場合、できることをお勧めしますか?

役に立ちましたか?

解決

HAPホームページの議論でまったく同じエラーが報告されていますが、数年以内にプロジェクトに意味のある修正が加えられていないようです。励ましません。

ソースをすばやく参照すると、HtmlNode.csの行92をコメントアウトすることでエラーを修正できることが示唆されています。

// they sometimes contain, and sometimes they don 't...
ElementsFlags.Add("option", HtmlElementFlag.Empty);

(実際には、ラベルテキストが含まれますが、空白の文字列も有効なテキストになります。不注意な作成者は終了タグを省略できますが、それはどの要素にも当てはまります。)

追加

同等の解決策は、Liberaryを使用する前に HtmlNode.ElementsFlags.Remove(&quot; option&quot;); を呼び出すことです(ライブラリのソースコードを変更する必要はありません)

他のヒント

Optionタグを&quot; generic&quot;として解析しない理由があるようです。タグ、XHTML準拠の場合、ただし、これは非常に苦痛です。

私の提案は、文字列全体を置換し、すべての「オプション」を変更することです。 &quot; my_option&quot;へのタグタグ、そのように:

  1. ライブラリのソースを変更する必要はありません(後でアップグレードできます)。
  2. 通常どおりに解析できます。

HtmlAgilityPackフォーラムの元の投稿は、次の場所にあります。 http://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=14982

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top