如何使用HTMLAgilityPack克隆并重复替换模板节点X次?
使用HTMLAgilityPack批量生成tbody表格行
实现步骤
- 加载HTML模板文档,定位到
id="transTable"的<tbody>节点 - 提取模板中的
<tr>节点作为重复模板,随后清空原tbody的内容 - 遍历数据集合,为每个数据项复制模板
<tr>,替换占位符(如##TransID##) - 将替换后的
<tr>节点逐一追加到tbody中 - 输出或保存处理后的HTML文档
代码示例
假设我们定义交易数据类:
public class Transaction { public string TransID { get; set; } public string TermSeq { get; set; } public string TimeStamp { get; set; } public string Amount { get; set; } }
核心处理逻辑:
// 加载HTML模板文件 var htmlDoc = new HtmlDocument(); htmlDoc.Load("你的模板文件路径.html"); // 定位目标tbody节点 var targetTbody = htmlDoc.GetElementbyId("transTable"); if (targetTbody == null) throw new InvalidOperationException("未找到id为transTable的tbody节点"); // 提取并复制tr模板,随后清空原tbody内容 var trTemplate = targetTbody.SelectSingleNode("./tr").CloneNode(true); targetTbody.RemoveAllChildren(); // 模拟业务数据集合 var transactionList = new List<Transaction> { new Transaction { TransID = "123", TermSeq = "1", TimeStamp = "2024-01-30", Amount = "400" }, new Transaction { TransID = "53", TermSeq = "2", TimeStamp = "2024-01-31", Amount = "100" }, new Transaction { TransID = "12444", TermSeq = "534", TimeStamp = "2024-01-31", Amount = "9" } }; // 遍历数据生成表格行 foreach (var trans in transactionList) { // 复制模板tr节点 var newTr = trTemplate.CloneNode(true); // 替换占位符(两种方式可选) // 方式1:按td位置定位替换 newTr.SelectSingleNode("./td[1]").InnerHtml = trans.TransID; newTr.SelectSingleNode("./td[2]").InnerHtml = trans.TermSeq; newTr.SelectSingleNode("./td[3]").InnerHtml = trans.TimeStamp; newTr.SelectSingleNode("./td[4]").InnerHtml = trans.Amount; // 方式2:按占位符文本定位替换(更灵活,不依赖td顺序) // newTr.SelectSingleNode("./td[text()='##TransID##']").InnerHtml = trans.TransID; // newTr.SelectSingleNode("./td[text()='##TermSeq##']").InnerHtml = trans.TermSeq; // newTr.SelectSingleNode("./td[text()='##TimeStamp##']").InnerHtml = trans.TimeStamp; // newTr.SelectSingleNode("./td[text()='##Amount##']").InnerHtml = trans.Amount; // 将生成的tr添加到tbody targetTbody.AppendChild(newTr); } // 保存处理后的HTML文件 htmlDoc.Save("处理后的文件路径.html");
关键说明
CloneNode(true)用于深度复制节点,确保模板的结构和文本被完整复制RemoveAllChildren()清空原tbody内容,避免保留初始的模板tr- 两种占位符替换方式可按需选择,按文本定位的方式更适配模板结构调整的场景
内容的提问来源于stack exchange,提问作者Ahmed ilyas
相关产品推荐
相关产品推荐

