我有以下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到specialchars:
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≥`
和副Versa
答案 0 :(得分:3)
如果我理解正确,这可能会成功。如果没有,请在预期文本之前,之间,之后显示清楚。
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;
}
注意:我也更新了其他方法!