2012-04-17 23 views
2

私はWYSIWYGへの入力をクリーンアップするためにHTMLアジリティパックを使用しています。これはこれを行うための最良の方法ではないかもしれませんが、私は正規表現との接触で爆発する開発者と協力しているので、十分でなければなりません。私は空の段落タグを除去する必要が親ノードがない場合ノードを削除する方法

<p></p> 
<p></p> 
<p><span><input id="textbox" type="text" /></span></p> 

私のWYSIWYGコンテンツが(例えば)このようになります。ここでは、私は現時点ではそれをやっている方法は次のとおりです。ただし

HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//p"); 
if (nodes == null) 
    return; 

foreach (HtmlNode node in nodes) 
{ 
    node.InnerHtml = node.InnerHtml.Trim(); 
    if (node.InnerHtml == string.Empty) 
     node.ParentNode.RemoveChild(node); 
} 

、HTMLは、段落タグは、親ノードを持っていないとParentNodeがnullであるため、RemoveChildしたがって失敗する完全な文書ではありませんので。

タグを削除する別の方法はありません。代わりの方法で誰かを指摘できますか?

+1

'node == null'を設定しますか? – Oded

+0

divにコンテンツ全体をラップし、現在のメソッドを使用してから親を削除しますか? –

+1

」のようなケースを指摘したいと思っていました。クリーンアップにはどれくらい重要なのでしょうか?あなたのforeachを進めることは親を最初にチェックし、それが空ではなく、次に子供を見つけ、それを空にして削除するが、親は空であるが、再びチェックされない。 –

答えて

3

は技術的には、最初のレベルの要素は、ドキュメントルートの子であるので、次のコードは動作するはずです:

if (node.InnerHtml == String.Empty) { 
    HtmlNode parent = node.ParentNode; 
    if (parent == null) { 
     parent = doc.DocumentNode; 
    } 
    parent.RemoveChild(node); 
} 
+0

'(node.ParentNode ?? doc.DocumentNode).RemoveChild(node)'はうまくいきませんでしたので、このようなことはうまくいかないと思っていました。代わりにこのようにすると、完全に機能します。 – Jon

0

あなたは右、コレクションから削除したいですか?

HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//p"); 
if (nodes == null) 
    return; 

for (int i = 0; i < nodes.Count - 1; i++) 
{ 
    nodes[i].InnerHtml = nodes[i].InnerHtml.Trim(); 
    if (nodes[i].InnerHtml == string.Empty) 
     nodes.Remove(i); 
} 
+0

私は文書だけでなく、コレクションから削除する必要があります。 – Jon

+0

別の答えが良いです、あなたはまだforeach反復を使用していますか? –

+0

はい、私はforeachループ内のコードを変更しました。 – Jon

関連する問題