24

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 が本当に不正な形式でない限り、判断を下したり、エラーを発生させたりしたくありません。私が望むように動作させる方法はありますか?具体的には、HtmlDocument のいくつかのオプションを設定してみました。

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

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

4

2 に答える 2

32

まったく同じエラーが HAP ホームページのディスカッションで報告されていますが、この数年間、プロジェクトに対して意味のある修正が行われていないようです。励みにはなりません。

ソースを簡単に参照すると、HtmlNode.cs の 92 行目をコメントアウトすることでエラーを修正できる可能性があることがわかります。

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

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

追加

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

于 2008-11-16T02:22:46.617 に答える
5

XHTML に準拠するために、Option タグを「一般的な」タグとして解析しない理由があるようですが、これは本当に頭の痛い問題です。

私の提案は、文字列全体の置換を行い、すべての「オプション」タグを「my_option」タグに変更することです。

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

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

于 2010-11-05T14:30:58.777 に答える