我想用另一个文本替换HTML标签的内部文本。
我正在使用HtmlAgilityPack
我使用此代码提取所有文本
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是readonly。如何用其他文本替换文本并将其保存到文件?
答案 0 :(得分:20)
请尝试以下代码。它选择没有子节点的所有节点并过滤掉脚本节点。也许你需要添加一些额外的过滤。除了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);
}
答案 1 :(得分:15)
奇怪,但我发现InnerHtml不是只读的。当我试图像那样设置它时
aElement.InnerHtml = "sometext";
InnerText
的值也更改为"sometext"
答案 2 :(得分:1)
import java.util.Scanner;
import edhesive.testing.Math;
public class U2_L8_Activity_One{
public static void main(String[] args){
System.out.println("Please enter a integer");
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
double ran = Math.random();
int min = 1;
int answer = (int) (Math.random() * n) + min;
int answer1 = (int) (Math.random() * n) + min;
int answer2 = (int) (Math.random() * n) + min;
int answer3 = (int) (Math.random() * n) + min;
int answer4 = (int) (Math.random() * n) + min;
int answer5 = (int) (Math.random() * n) + min;
int answer6 = (int) (Math.random() * n) + min;
int answer7 = (int) (Math.random() * n) + min;
int answer8 = (int) (Math.random() * n) + min;
int answer9 = (int) (Math.random() * n) + min;
System.out.println(answer);
System.out.println(answer1);
System.out.println(answer2);
System.out.println(answer3);
System.out.println(answer4);
System.out.println(answer5);
System.out.println(answer6);
System.out.println(answer7);
System.out.println(answer8);
System.out.println(answer9);
}
}
类具有HtmlTextNode
属性 * ,可以完美地用于此目的。
这是一个例子:
Text
如果我们有一个var textNodes = doc.DocumentNode.SelectNodes("//body/text()").Cast<HtmlTextNode>();
foreach (var node in textNodes)
{
node.Text = node.Text.Replace("foo", "bar");
}
要更改其 direct 文本,则可以执行以下操作:
HtmlNode
或者我们可以使用HtmlNode node = //...
var textNode = (HtmlTextNode)node.SelectSingleNode("text()");
textNode.Text = "new text";
来防止多个。
* 不要与只读node.SelectNodes("text()")
属性混淆。