2011-11-25 114 views
23

我想用另一個文本替換HTML標記的內部文本。 我使用HtmlAgilityPack
我使用此代碼提取所有文本HtmlAgilityPack設置節點InnerText

HtmlDocument doc = new HtmlDocument(); 
doc.Load("some path") 

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//text()[normalize-space(.) != '']")) { 
    // How to replace node.InnerText with some text ? 
} 

但是innerText屬性爲只讀。我如何用另一個文本替換文本並將它們保存到文件?

+0

元素的內部文本是所有兒童的組合標籤內的文本。你想用文本節點替換所有的兒童標籤嗎? –

+0

@YuriyRozhovetskiy我想用一些文本替換每個元素文本,我確實想將網站翻譯成另一種語言。 我想提取頁面中的所有文本,然後翻譯,替換和保存。 – Shahin

+2

XML文檔說這個屬性'獲取或設置對象的開始和結束標記之間的文本'是奇怪的,但後來只提供了一個'get'方法...... – BrainSlugs83

回答

19

嘗試下面的代碼。它選擇所有沒有子節點的節點並過濾出腳本節點。也許你需要添加一些額外的過濾。除了你的XPath表達式之外,這個還會尋找葉節點並過濾出<script>標籤的文本內容。

var nodes = doc.DocumentNode.SelectNodes("//body//text()[(normalize-space(.) != '') and not(parent::script) and not(*)]"); 
foreach (HtmlNode htmlNode in nodes) 
{ 
    htmlNode.ParentNode.ReplaceChild(HtmlTextNode.CreateNode(htmlNode.InnerText + "_translated"), htmlNode); 
} 
+0

非常感謝。我怎麼能覆蓋翻譯的HTML到以前的文件? 我從文件加載節點/ – Shahin

+0

Got It! Docsave ..非常感謝:] – Shahin

+0

如果可能的話,請描述一下我的代碼XPath和你的代碼有什麼不同? – Shahin

10

奇怪,但我發現InnerHtml不是隻讀的。當我試圖把它像

aElement.InnerHtml = "sometext"; 

InnerText值也改爲"sometext"

+1

但你運行改變html標籤的機會也是 – jnoreiga

+3

InnerHtml不是隻讀的。 InnerText是。該文件似乎是錯誤的InnerText不是隻讀。 – liang

+0

雖然'InnerHtml'支持get/set,但在某些情況下,它並不總是看起來實際上改變文檔內容。如果您設置了它,然後查看文檔的'OuterHtml',則內容並不總是被更改。 – Memetican