2017-01-17 13 views
1

私はこのような入力HTMLがすべきAngleSharpでHTMLパーサーを書いています文書全体を読む関数:HTMLパーサIElementのテキストは

using AngleSharp.Dom; 
using AngleSharp.Dom.Html; 
using AngleSharp.Extensions; 
using AngleSharp.Parser.Html; 

private void processHTMLNode(IElement node, IElement targetNode) 
{ 
    switch (node.NodeName.ToLower()) 
    { 
    //... 
    case "a": 
     if(node.HasAttribute("href") && node.GetAttribute("href").StartsWith("#")) 
     { 
      break; 
     } 
     var aNew = outputDocument.CreateElement("a"); 
     aNew.SetAttribute("href", node.GetAttribute("href")); 
     aNew.TextContent = node.TextContent; 
     targetNode.AppendChild(aNew); 
     break; 
    case "p": 
     var pNew = outputDocument.CreateElement<IHtmlParagraphElement>(); 
     foreach (var childNode in node.Children) 
     { 
      processHTMLNode(childNode, pNew); 
     } 
     //TODO fix this 
     pNew.TextContent = node.TextContent; 
     targetNode.AppendChild(pNew); 
     break; 
    } 
    //... 
} 

問題は、その設定は、TextContent属性はa-p -Nodeの子である要素を上書きします。また、注文(テキスト - >リンク - >テキスト)は失われます。

これを正しく実装するにはどうすればよいですか?

答えて

0

わかりましたので、私は次のコードを使用して私の問題を解決するために管理:

using AngleSharp.Dom; 
using AngleSharp.Dom.Html; 
using AngleSharp.Extensions; 
using AngleSharp.Parser.Html; 

private void processHTMLNode(INode node, IElement targetElement) 
{ 
    IElement elementNode; 
    IText textNode; 

    if ((elementNode = node as IElement) != null) 
    { 
     switch (node.NodeName.ToLower()) 
     { 
      //... 
      case "a": 
       if(node.HasAttribute("href") && node.GetAttribute("href").StartsWith("#")) 
       { 
        break; 
       } 
       var aNew = outputDocument.CreateElement("a"); 
       aNew.SetAttribute("href", node.GetAttribute("href")); 
       foreach (var childNode in elementNode.ChildNodes) 
       { 
        processHTMLNode(childNode, aNew); 
       } 
       targetElement.AppendChild(aNew); 
       break; 
      case "p": 
       var pNew = outputDocument.CreateElement("p"); 
       foreach (var childNode in node.Children) 
       { 
        processHTMLNode(childNode, pNew); 
       } 
       targetElement.AppendChild(pNew); 
       break; 
      //... 
     } 

    } 
    else if ((textNode = node as IText) != null) 
    { 
     var newTextNode = outputDocument.CreateTextNode(textNode.Text); 
     targetElement.AppendChild(newTextNode); 
    } 
} 

この画像をAngleSharpドキュメントからは私をたくさん助けた: AngleSharp DOM

関連する問題