可以删除包含父div的(x)符号的项目。
<div>
<div>
<h2 id="-663241532">
<span>Item 1</span>
</h2>
<p>Content 1</p>
</div>
<div>
<h4 id="1074494955">
<span>(x)Item 1.1.1</span>
</h4>
<p>Title 2</p>
<div>
Content 2
</div>
</div>
</div>
删除后必须
<div>
<div>
<h2 id="-663241532">
<span>Item 1</span>
</h2>
<p>Content 1</p>
</div>
</div>
我写了这个正则表达式
@"<div>(.*?)<span>\(x\)(.*?)</span>(.*?)</div>"
但它也删除了第一个div。
如果有帮助,我可以访问ID -663241532。
答案 0 :(得分:3)
正如所建议的正则表达式不是xml文档操作的最佳工具。使用Linq to XML的示例解决方案:
var xDoc = XDocument.Parse(html);
var spansToRemove = xDoc.Descendants("span")
.Where(s => s.Value.StartsWith("(x)")).ToArray();
foreach (var toRemove in spansToRemove)
{
var element = toRemove;
while (element != null && element.Name != "div")
element = element.Parent;
if (element != null)
element.Remove();
}
答案 1 :(得分:3)
我建议你使用HtmlAgilityPack(可从NuGet获得)来处理HTML:
HtmlDocument doc = new HtmlDocument();
doc.Load("index.html");
var spans = doc.DocumentNode.SelectNodes("//span[contains(., '(x)')]");
foreach (var span in spans)
{
HtmlNode parent = span.ParentNode;
while (parent != null)
{
if (parent.Name == "div")
{
parent.Remove();
break;
}
parent = parent.ParentNode;
}
}
上面的XPath选择包含span
文本的所有(x)
个节点。然后在循环中,我们搜索每个所选div
的最近的span
父项并将其删除。