2

可以删除带有 (x) 符号的项目,包括父 div。

<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 -6​​63241532。

4

2 回答 2

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();
}
于 2013-11-04T14:46:12.737 回答
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并将其删除。

于 2013-11-04T14:51:02.180 回答