2011-11-25 104 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