HtmlAgilityPack:html要素をクラスと一緒に1つのタグに結合するにはどうすればいいですか?

html-agility-pack vb.net

質問

問題: HtmlAgilityPackを使用していくつかのHTML要素を調べ、タグ名を組み合わせる必要があります。親から子への各タグを抽出して、 "strikeUEmStrong"という名前のクラスを持つスパンに置き換えることは可能ですか?また、名前はHTML要素に基づいて変更されます。

クラスの名前の順番は実際問題ですが、私は試行錯誤でこれを認識しました。限り、すべての要素を取得し、それらを組み合わせることができる限り。さまざまなレベルの書式設定を持つ複数のテキストノードを持つことは非常に可能です。

これは複数の段落に影響します。

たとえば、私はこのhtmlコードを持っています:

<p>
<strike><u><em><strong>four styles</strong></em></u></strike></p>

どのように私はこれに変換する:

<p>
<strike><u><em><strong>four styles</strong></em></u></strike></p>

このタイプのコードを持つことも可能です:

<p>
<strike><u><em><strong>four styles</strong></em></u></strike></p>

出力は次のようになります。

<p>
<strike><u><em><strong>four styles</strong></em></u></strike></p>

プロトタイプ:

<p>
<strike><u><em><strong>four styles</strong></em></u></strike></p>

出力:

<p>
<strike><u><em><strong>four styles</strong></em></u></strike></p>

最終的に正しい出力を得るために、私は注文の問題を修正した。お手伝いありがとう。

受け入れられた回答

これは正直な答えではありません。私はこれを行うためにアルゴリズムを書く方法を説明し、擬似コードを含めて説明します。

  1. 私は親のタグを手に入れた。私はあなたがすべての "p"タグに対してこれをしたいと仮定します
  2. 私は子供のタグを繰り返し、タグ名をつけてクラス名に追加します
  3. 私は追加されたタグ名が得られるまで再帰的に子を繰り返します

擬似コード。私はこれをタイピングしているので、間違いはありません。

public string GetClassName(Node n)
{
var ret = n.TagName;

foreach(var child in n.ChildNodes)
{
ret += GetClassName(child);
}

return ret;
}


foreach(var p in paragraphs)
{
foreach(var child in p.ChildNodes)
{
 var span = new Span();
 span.InnerText = child.InnerText; // strip all tags, just take the inner text

span.ClassName = GetClassName(child);

child.ReplaceWith(span); // note: if you do this with a FOREACH and not a for loop, it'll blow up C# for modifying the collection while iterating.  Use for loops. if you're going to do "active" replacement like in this pseudo code
}
}

より多くの文脈を得ると、私は自分の答えを修正することができて嬉しいです。あなたが私の提案を洗練させる必要がある場合は、私が提案していることをレビューし、より多くの文脈でそれについてコメントしてください。そうでない場合は、これがあなたに必要なものを得ることを願っています:)




ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ