HTML에서 비어 있거나 불필요한 노드를 모두 제거하십시오.

c# html-agility-pack

문제

빈 노드와 불필요한 노드를 모두 제거하는 가장 좋은 방법은 무엇입니까? 예를 들어

<p></p> <font><p><span><br></span></p></font> 도 제거해야합니다 (이 경우 br 태그는 불필요한 것으로 간주됩니다) )

이 일종의 재귀 함수를 사용해야합니까? 나는이 라인을 따라 뭔가를 생각하고있다.

 RemoveEmptyNodes(HtmlNode containerNode)
 {
     var nodes = containerNode.DescendantsAndSelf().ToList();

      if (nodes != null)
      {
          foreach (HtmlNode node in nodes)
          {
              if (node.InnerText == null || node.InnerText == "")
              {
                   RemoveEmptyNodes(node.ParentNode);
                   node.Remove();
               }
           }
       }
  }

하지만 그것은 분명히 작동하지 않습니다 (stackoverflow 예외).

수락 된 답변

제거해서는 안되는 태그는 목록에 이름을 추가 할 수 있으며 컨테이너 노드는 containerNode.Attributes.Count == 0 (예 : Images) 때문에 제거되지 않습니다.

static List<string> _notToRemove;

static void Main(string[] args)
{
    _notToRemove = new List<string>();
    _notToRemove.Add("br");

    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml("<html><head></head><body><p>test</p><br><font><p><span></span></p></font></body></html>");
    RemoveEmptyNodes(doc.DocumentNode);
}

static void RemoveEmptyNodes(HtmlNode containerNode)
{
    if (containerNode.Attributes.Count == 0 && !_notToRemove.Contains(containerNode.Name) && string.IsNullOrEmpty(containerNode.InnerText))
    {
        containerNode.Remove();
    }
    else
    {
        for (int i = containerNode.ChildNodes.Count - 1; i >= 0; i-- )
        {
            RemoveEmptyNodes(containerNode.ChildNodes[i]);
        }
    }
}



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.