如何根据内部符号删除父div?

时间:2013-11-04 14:31:12

标签: c# html regex

可以删除包含父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。

2 个答案:

答案 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父项并将其删除。