2012-06-15 135 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文档中。 –