2012-06-15 93 views
1

我們使用的第三部分導出應用程序將無法正確呈現段落標籤(不包括段落之間的額外行),所以我試圖用HtmlAgilityPack替換所有帶有兩個換行符標籤的段落標籤。HtmlAgilityPack使用換行符替換段落標籤

這裏是我迄今爲止...

// 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> 

任何想法,我做錯了什麼? 我覺得那裏有一個更簡單的方法,是嗎?

+2

你可以嘗試更換'paragraphTags [I]一個.remove();''通過paragraphTags [I] .ParentNode.RemoveChild(paragraphTags [1]);'。我的Html Agility Pack版本(1.3.0.0)適用於此。 –

回答

6

想通了。 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]); 
} 
2

它是否幫助,如果你使用

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

創建換行符節點?

+0

它確實將換行符標記更改爲「
」而不是必須「
」,但它仍然只將一個換行符插入到html文檔中。 –