2012-06-15 3 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 [я] .ParentNode.RemoveChild (paragraphTags [я]);'. Моя версия Html Agility Pack (1.3.0.0) работает с этим. –

ответ

6

Выяснил это. Подпишитесь к Петру и Симону за предложениями. Ключ, казалось, состоял в том, что мне нужны два разных узла очереди линий.

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"); 

создать LineBreak узел?

+0

Он меняет тег разрыва строки на «
» вместо «
», но он по-прежнему только вставляет один штрих в html-документ. –

Смежные вопросы