删除无效节点

时间:2016-03-11 07:05:32

标签: c# html-agility-pack

我想从<ul><ol>标记中删除无效的子节点。 就像我有html之类的东西:

<ul><table>..</table><h1>dfds</h1><li>sfd</li></ul>

具体来说,在此示例中,我想删除除<ul>以外的<li>内的任何标记。我只想要来自Html字符串的<ul><li>sfd</li></ul>

我想在服务器方面这样做,我可以使用HtmlAglityPack。我正在使用c#。

这不是常规的非闭合标记问题,这是一个不同的情况,解析PDF中的html是个问题。如果你想尝试,使用iTextsharp xml worker DLL,并尝试将此html解析为PDF,它将抛出异常:

<html><body><ul><h1>test</h1><li>dsdsf</li></ul></body></html>

标签的结尾可以通过HtmlDocument类属性来控制,如下所示:

OptionOutputAsXml = true,
OptionCheckSyntax = true,
OptionFixNestedTags = true,
OptionWriteEmptyNodes = true,
OptionAutoCloseOnEnd = true

2 个答案:

答案 0 :(得分:1)

请参阅下面的working demo example

var raw = @"<ul><table>..</table><h1>dfds</h1><li>sfd</li></ul>";
var doc = new HtmlDocument();
doc.LoadHtml(raw);

//inspect all <ul> and <ol> elements
var elementsToBeChecked = doc.DocumentNode.SelectNodes("//*[self::ul or self::ol]");
foreach (HtmlNode element in elementsToBeChecked)
{
    //iterate through all non <li> child element and remove them
    foreach (HtmlNode invalidElement in element.SelectNodes("*[not(self::li)]"))
    {
        invalidElement.Remove();
    }
}

Console.WriteLine(doc.DocumentNode.OuterHtml);

输出

<ul><li>sfd</li></ul>

答案 1 :(得分:1)

string x = "<ul><table>..</table><h1>dfds</h1><li>sfd</li></ul>";
htmlDoc.LoadHtml(x);
HtmlNodeCollection hNC = htmlDoc.DocumentNode.SelectNodes("//ul/*");
foreach (HtmlNode h in hNC)
{
    if(h.Name != "li")
    {
        Console.WriteLine("Removes tag: "+h.Name);
        h.Remove();       
    }
}

Console.WriteLine(htmlDoc.DocumentNode.SelectSingleNode("/ul").InnerHtml);