5

HTML Agility Pack を使用して要素を選択し、読み込まれた html 文字列からその要素とそれに含まれるすべてのものを返します。コードをテストする際に、w3schools の select タグの例に対して実行しました。

<select name="cars">
  <option value="volvo">Volvo XC90</option>
  <option value="saab">Saab 95</option>
  <option value="mercedes">Mercedes SLK</option>
  <option value="audi">Audi TT</option>
</select>

HTMLアジリティパックでこれを選択して返そうとすると、次のようになります(オプションの終了タグが削除されました):

<select name="cars">
  <option value="volvo">Volvo XC90
  <option value="saab">Saab 95
  <option value="mercedes">Mercedes SLK
  <option value="audi">Audi TT
</select>

そこで、ここで検索を行ったところ、次の行を追加する指示が見つかりました: HtmlNode.ElementsFlags.Remove("option");

私はそれをしました、そして今私は得ます(オプションテキストはオプションタグの外に移動されます):

<select name="cars">
  <option value="volvo"></option>Volvo XC90
  <option value="saab"></option>Saab 95
  <option value="mercedes"></option>Mercedes SLK
  <option value="audi"></option>Audi TT
</select>

出力を元の HTML と一致させたいと考えています。それを得るために私は何をする必要がありますか?

また、入力タグでテストしたときに、自己終了が削除されていたため、OptionWriteEmptyNodes で遊んでいました。そのオプションを追加すると、それが修正されたようです。この問題に影響を与えていないことを確認するために、今コメントアウトしました。

これは私の .NET C# コードです:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(content);
HtmlNode.ElementsFlags.Remove("option"); // otherwise, the closing tag is removed.

//doc.OptionWriteEmptyNodes = true;

var nodes = doc.DocumentNode.SelectNodes("//select");

if (nodes == null)
    return "Not found";
else
    return nodes[0].OuterHtml;
4

1 に答える 1

4

オプションタグを機能させるには、ElementsFlag フィールドを設定する必要があります。

HtmlNode.ElementsFlags["option"] = HtmlElementFlag.Closed;

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);

元の HTML コードが返されます。

HtmlAgilityPack がこのように動作する理由は、皮肉な<option>ことに-tag がHTML のオプションのタグであり、終了タグを必要としないためだと思います。

クラスのドキュメントとそのHtmlNodeフィールドから取得ElementsFlags

特定の要素ノードの特定の動作を定義するフラグのコレクションを取得します。このテーブルには、小文字のタグ名をキーとし、HtmlElementFlags の組み合わせを値とする DictionaryEntry リストが含まれています。

列挙型をさらに調べると、次のHtmlElementFlagことが明らかになります。

空 - ノードは空です。META または IMG は、そのようなノードの例です。Closed - ノードは解析中に自動的に閉じられます。

クラスHtmlNodeのソース コードを表示して、「固有」と見なされる他のタグを確認できます。

于 2013-07-30T14:41:21.590 に答える