HtmlAgilityPack은 단락 태그를 줄 바꿈으로 대체합니다.

c# html-agility-pack html-parsing

문제

우리가 사용하는 세 번째 부분 내보내기 응용 프로그램은 단락 태그를 올바르게 렌더링하지 않으므로 단락 사이에 여분의 줄은 포함되지 않으므로 HtmlAgilityPack을 사용하는 두 개의 linebreak 태그로 모든 단락 태그를 바꾸려고합니다.

여기 내가 지금까지 가지고있는 것이있다.

// Shortened for this example
string rawHtml = "<p><strong><span>1.0 Purpose</span></strong></p><p><span>The role</span></p><p><span>NOTE: Defined...</span></p>";

HtmlDocument doc = new HtmlDocument();
HtmlNode.ElementsFlags["br"] = HtmlElementFlag.Empty;
doc.LoadHtml(rawHtml);
doc.OptionWriteEmptyNodes = true;

// Updated using suggestion from Petr
HtmlNode linebreak = doc.CreateElement("br"); 
var paragraphTags = doc.DocumentNode.SelectNodes("p");
for (int i = 0; i < paragraphTags.Count; i++)
{
    HtmlNode childNode = HtmlNode.CreateNode(paragraphTags[i].InnerHtml);
    HtmlNode nextNode = paragraphTags[i];

    if (i > 0)
    {
        nextNode = doc.DocumentNode.InsertAfter(linebreak, nextNode);
        nextNode = doc.DocumentNode.InsertAfter(linebreak, nextNode);
    }
    doc.DocumentNode.InsertAfter(childNode, nextNode);
    paragraphTags[i].Remove();
}

단락 태그를 제거하지만 한 줄 바꿈 만 렌더링합니다. 나는 내가 가지고있는 한 멀리까지 인터넷을 검색했지만 아무것도 작동하지 않는 것 같습니다.

OuterHtml은 다음과 같이 보입니다.

<strong><span>1.0 Purpose</span></strong><br /><span>The role</span><br /><span>NOTE: Defined...</span>

내가 뭘 잘못하고 있는거야? 더 쉬운 방법이있는 것 같아요?

수락 된 답변

그것을 알아 냈다. 제안을 위해 Petr와 Simon에게 Upvote. 핵심은 두 개의 다른 linebreak 노드가 필요하다는 것입니다.

string rawHtml = "<p><strong><span>1.0 Purpose</span></strong></p><p><span>The role</span></p><p><span>NOTE: Defined...</span></p>";

HtmlDocument doc = new HtmlDocument();
HtmlNode.ElementsFlags["br"] = HtmlElementFlag.Empty;
doc.LoadHtml(rawHtml);
doc.OptionWriteEmptyNodes = true;

HtmlNode linebreak1 = doc.CreateElement("br");
HtmlNode linebreak2 = doc.CreateElement("br");
var paragraphTags = doc.DocumentNode.SelectNodes("p");
for (int i = 0; i < paragraphTags.Count; i++)
{
    if (i > 0)
    {
        doc.DocumentNode.InsertBefore(linebreak1, paragraphTags[i]);
        doc.DocumentNode.InsertBefore(linebreak2, paragraphTags[i]);
    }
    doc.DocumentNode.InsertBefore(HtmlNode.CreateNode(paragraphTags[i].InnerHtml), paragraphTags[i]);
    paragraphTags[i].ParentNode.RemoveChild(paragraphTags[i]);
}

인기 답변

사용하면 도움이됩니까?

HtmlNode linebreak = doc.CreateElement("br");

linebreak 노드를 만드시겠습니까?



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