我有以下 html 元素:
<div class="wrapper">
<span class="wrapper2">
<div class="myClass">
MyString
</div>
<button>buttonText</button>
</span>
</div>
So, I need to convert that element to be
≤MyString≥ free text <br> <i> <u>..... ≤MyString≥
所以,我弄清楚了如何从 html 转换为特殊字符,但无法弄清楚如何在 htmlAgilityPack 和 XPath 中向后转换为 html。我可以纯粹用正则表达式来做到这一点,但这不是最好的解决方案。
从 html 到特殊字符:
private string transformFromHtmlToMergeCodes(string text)
{
var doc = new HtmlDocument();
doc.LoadHtml(text);
var nodes = doc.DocumentNode.SelectNodes("//div[@class='wrapper']");
foreach (var item in nodes)
{
var innerText = "≤" + item.SelectSingleNode("//div[@class='myClass']").InnerText + "≥";
var textNode = HtmlNode.CreateNode(innerText);
item.ParentNode.ReplaceChild(textNode,item);
}
return doc.DocumentNode.InnerHtml;
}
从特殊字符到 html:
private string transformFromMergeCodesToHtml(string text)
{
var matches = Regex.Matches(text, @"\«(.*?)\»");
foreach (Match match in matches)
{
var innerText = match.Value
.Replace("≤", @"<div class=""wrapper"" contenteditable=""false"">
<span class=""wrapper2"">
<div class=""myClass"">").Replace("≥",@"</div><button type="" button"" class=""MergeCodeRemoveIcon"">×</button></span></div>");
text = text.Replace(match.Value, innerText);
}
return text;
}
所以,这是我想修改为使用 htmlAgilityPack 的第二个函数,因为这不是最有效的方法,特别是如果我有重复的节点。
我试图找到≤MyString≥
并将其转换为节点,但 HtmlAgilityPack 抛出错误,它不是有效的节点(这是有道理的。)有什么建议吗?
编辑
要明确的是。这是我要执行的转换:
之前:
<div class="wrapper">
<span class="wrapper2">
<div class="myClass">
MyString
</div>
<button>buttonText</button>
</span>
</div>
free text <br> <i> <u>.....
<div class="wrapper">
<span class="wrapper2">
<div class="myClass">
MyString2
</div>
<button>buttonText</button>
</span>
</div>
之后:
`≤MyString≥ free text <br> <i> <u>..... ≤MyString2≥`
反之亦然
最佳答案
如果我理解正确的话,这可能会起作用。如果没有,请在预期文本的前面、中间和后面清楚地显示出应该是什么样子。
var nodes = doc.DocumentNode.Descendants("#text").Where(text => Regex.IsMatch(text.InnerText.Trim(), @"≤[^≥]*≥"));
string format =
@"<div class=""wrapper"" contenteditable=""false""><span class=""wrapper2""><div class=""myClass"">{0}</div><button type="" button"" class=""MergeCodeRemoveIcon"">×</button></span></div>";
foreach (var htmlNode in nodes)
{
htmlNode.InnerHtml = string.Format(CultureInfo.InvariantCulture, format, htmlNode.InnerText.Trim().Trim(new[] { '≤', '≥' }));
}
return doc.DocumentNode.OuterHtml;
试试这个:
private static string transformFromMergeCodesToHtml(string textWithMergeCodes)
{
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(textWithMergeCodes);
var nodes = doc.DocumentNode.Descendants("#text").Where(text => Regex.IsMatch(text.InnerText.Trim(), @"≤[^≥]*≥"));
string format =
@"<div class=""wrapper"" contenteditable=""false""><span class=""wrapper2""><div class=""myClass"">$2</div><button type="" button"" class=""MergeCodeRemoveIcon"">×</button></span></div>";
foreach (var htmlNode in nodes)
{
htmlNode.InnerHtml = Regex.Replace(htmlNode.InnerText.Trim(), @"(≤)([^≥]*)(≥)", format);
}
return doc.DocumentNode.OuterHtml;
}
private static string transformFromHtmlToMergeCodes(string text)
{
var doc = new HtmlDocument();
doc.LoadHtml(text);
var nodes = doc.DocumentNode.SelectNodes("//div[@class='wrapper']");
foreach (var item in nodes)
{
var innerText = "≤" + item.SelectSingleNode("//div[@class='myClass']").InnerText.Trim() + "≥";
var textNode = HtmlNode.CreateNode(innerText);
item.ParentNode.ReplaceChild(textNode, item);
}
return doc.DocumentNode.InnerHtml;
}
注意:我还更新了其他方法!
关于c# - 将正则表达式转换为 htmlagilitypack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13870751/