我想从<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
答案 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);