2011-05-15 113 views
13

我正在嘗試使用HTML Agility Pack將腳本元素附加到我的html的HEAD部分的頂部。我迄今看到的例子只是使用AppendChild(element)方法來實現這一點。我需要將附加到頭部的腳本放在其他腳本之前。我怎樣才能指定這個?HTML Agility Pack - 如何在head元素的頂部添加元素?

這裏就是我想:

HtmlDocument htmlDocument = new HtmlDocument(); 
htmlDocument.Load(filePath); 
HtmlNode head = htmlDocument.DocumentNode.SelectSingleNode("/html/head"); 
HtmlNode stateScript = htmlDocument.CreateElement("script"); 
head.AppendChild(stateScript); 
stateScript.SetAttributeValue("id", "applicationState"); 
stateScript.InnerHtml = "'{\"uid\":\"testUser\"}'"; 

我想朝着頭,而不是附加在末尾的頂端增加了一個腳本標籤。

+1

旁註其他人發現這個問題:'stateScript.InnerHtml = ...'有時會做你的javascript的奇怪的東西。要解決這個問題,你可以改爲'stateScript.AppendChild(htmlDocument.CreateTextNode(scriptText));' – jp36 2012-04-02 16:11:16

回答

7

明白了..

HtmlNode有以下方法:

HtmlNode.InsertBefore(node, refNode) 
HtmlNode.InsertAfter(nodeToAdd, refNode) 
+0

不要忘了勾選你的答案爲「答案」。 – 2011-05-16 06:43:59

+0

修改HTML源代碼時要小心。它可以改變可能不想觸摸':/'的HTML代碼的其他部分 – 2011-05-18 08:01:52

14

意識到這是一個老問題,也有在前面加上可能不會存在那麼子元素的可能性。

// Load content as new Html document 
HtmlDocument html = new HtmlDocument(); 
html.LoadHtml(oldContent); 

// Wrapper acts as a root element 
string newContent = "<div>" + someHtml + "</div>"; 

// Create new node from newcontent 
HtmlNode newNode = HtmlNode.CreateNode(newContent); 

// Get body node 
HtmlNode body = html.DocumentNode.SelectSingleNode("//body"); 

// Add new node as first child of body 
body.PrependChild(newNode); 

// Get contents with new node 
string contents = html.DocumentNode.InnerHtml;