C# 如何使用HTML Agility Pack修复格式错误的HTML?
我的HTML格式错误,标签重叠: 单词1单词2 单词3单词4 重叠也可以嵌套 如何使用HTML Agility Pack HAP将其转换为格式良好的HTML 我正在寻找以下输出: 单词1单词2 单词3单词4C# 如何使用HTML Agility Pack修复格式错误的HTML?,c#,html,.net,parsing,html-agility-pack,C#,Html,.net,Parsing,Html Agility Pack,我的HTML格式错误,标签重叠: 单词1单词2 单词3单词4 重叠也可以嵌套 如何使用HTML Agility Pack HAP将其转换为格式良好的HTML 我正在寻找以下输出: 单词1单词2 单词3单词4 我尝试了HtmlNode.ElementsFlags[b]=HtmlElementFlag.Closed | HtmlElementFlag.CanOverlap,但它没有按预期工作。它实际上按预期工作,但可能没有按预期工作。无论如何,下面是一段控制台应用程序的示例代码,演示了如何使用该库实
我尝试了HtmlNode.ElementsFlags[b]=HtmlElementFlag.Closed | HtmlElementFlag.CanOverlap,但它没有按预期工作。它实际上按预期工作,但可能没有按预期工作。无论如何,下面是一段控制台应用程序的示例代码,演示了如何使用该库实现一些HTML修复 该库有一个ParseErrors集合,可用于确定在标记解析期间检测到的错误 这里确实存在两种类型的问题: 1未闭合的元件。默认情况下,库会修复这个问题,但在这种情况下,P元素上有一个选项可以防止出现这种情况 2个未打开的元件。这一个更复杂,因为它取决于您想如何修复它,您想在哪里打开标记?在下面的示例中,我使用了最近的上一个文本同级节点来打开元素
static void Main(string[] args)
{
// clear the flags on P so unclosed elements in P will be auto closed.
HtmlNode.ElementsFlags.Remove("p");
// load the document
HtmlDocument doc = new HtmlDocument();
doc.Load("yourTestFile.htm");
// build a list of nodes ordered by stream position
NodePositions pos = new NodePositions(doc);
// browse all tags detected as not opened
foreach (HtmlParseError error in doc.ParseErrors.Where(e => e.Code == HtmlParseErrorCode.TagNotOpened))
{
// find the text node just before this error
HtmlTextNode last = pos.Nodes.OfType<HtmlTextNode>().LastOrDefault(n => n.StreamPosition < error.StreamPosition);
if (last != null)
{
// fix the text; reintroduce the broken tag
last.Text = error.SourceText.Replace("/", "") + last.Text + error.SourceText;
}
}
doc.Save(Console.Out);
}
public class NodePositions
{
public NodePositions(HtmlDocument doc)
{
AddNode(doc.DocumentNode);
Nodes.Sort(new NodePositionComparer());
}
private void AddNode(HtmlNode node)
{
Nodes.Add(node);
foreach (HtmlNode child in node.ChildNodes)
{
AddNode(child);
}
}
private class NodePositionComparer : IComparer<HtmlNode>
{
public int Compare(HtmlNode x, HtmlNode y)
{
return x.StreamPosition.CompareTo(y.StreamPosition);
}
}
public List<HtmlNode> Nodes = new List<HtmlNode>();
}
谢谢Simon,我需要消化一下:很高兴能直接从作者那里听到你的作品,你在HAP上的作品受到了广泛的赞赏。这方面有什么特别的情况吗?我之所以这样问,是因为我似乎在框架未被自动关闭的情况下出现了意外行为。@twobob-是的,也许,您可以在声明框架时检查此行为,您可以使用ElementFlags集合将其删除:我为您创建如此有用的库向您致敬。