2012-04-17 2 views
2

HTML 민첩성 팩을 사용하여 WYSIWYG에 대한 입력을 정리하고 있습니다. 이것은 최선의 방법이 아니지만 정규 표현식과의 접촉으로 폭발하는 개발자와 협력하고 있으므로 충분해야합니다. 나는 빈 단락 태그를 제거 할 필요가부모 노드가없는 노드 삭제

<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