【问题标题】:How to remove a parent div based on the symbol it has inside?如何根据里面的符号删除父 div?
【发布时间】:2013-11-15 04:52:07
【问题描述】:

可以删除带有 (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。

【问题讨论】:

  • 不要为此使用正则表达式,使用 HTML/XML 解析器。

标签: c# html regex


【解决方案1】:

我建议您使用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 选择所有包含 (x) 文本的 span 节点。然后在循环中,我们搜索每个选定span 的最近div 父级并将其删除。

【讨论】:

  • 我明白了。谢谢你的解决方案。作品! :)
【解决方案2】:

正如建议的那样,正则表达式不是 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 以获得更紧凑的删除逻辑,但请记住,有效的 html 可以被视为无效的 xml
  • 同意,这就是为什么我赞成您的 HtmlAgilityPack 答案 - 很棒的库,为我节省了很多次。
猜你喜欢
  • 2018-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
相关资源
最近更新 更多