Sửa 1: Dưới đây là làm thế nào để sửa chữa một tài liệu HTML Agilty Pack để hiển thị một cách chính xác hình ảnh (img) tags:
if (HtmlNode.ElementsFlags.ContainsKey("img"))
{ HtmlNode.ElementsFlags["img"] = HtmlElementFlag.Closed;}
else
{ HtmlNode.ElementsFlags.Add("img", HtmlElementFlag.Closed);}
thay thế "img" cho bất kỳ thẻ nào khác để khắc phục chúng (nhập, chọn và tùy chọn xuất hiện thường xuyên). Lặp lại khi cần thiết. Hãy nhớ rằng điều này sẽ tạo ra chứ không phải vì lỗi HAP ngăn cản các cờ "đóng" và "trống" được đặt đồng thời. Nguồn: MikeBridge tại http://htmlagilitypack.codeplex.com/discussions/53782
Original câu trả lời: Vừa lao động qua các giải pháp cho vấn đề này, và không tìm thấy bất kỳ đầy đủ câu trả lời (loại tài liệu được thiết lập đúng cách, sử dụng Output dưới dạng XML, Kiểm tra cú pháp, AutoCloseOnEnd, và Viết tùy chọn Node Trống) , Tôi đã có thể giải quyết vấn đề này với một hack bẩn. Điều này chắc chắn sẽ không giải quyết vấn đề hoàn toàn cho mọi người, nhưng đối với bất kỳ ai trả về html/xml được tạo dưới dạng chuỗi (EG qua dịch vụ web), giải pháp đơn giản là sử dụng thẻ giả mà gói nhanh nhẹn không biết phá vỡ . Khi bạn đã hoàn tất mọi việc cần làm trên tài liệu, hãy gọi phương thức sau một lần cho mỗi thẻ khiến bạn đau đầu (ví dụ đáng chú ý là tùy chọn, đầu vào và img). Ngay sau đó, hiển thị chuỗi cuối cùng của bạn và thực hiện thay thế đơn giản cho mỗi thẻ được bắt đầu bằng một số chuỗi (trong trường hợp này là "Fix_" và trả về chuỗi của bạn. này chỉ nhỉnh hơn trong quan điểm của tôi hơn so với giải pháp regex đề xuất trong một câu hỏi tôi không thể xác định vị trí tại thời điểm này (một cái gì đó dọc theo dòng)
private void fixHAPUnclosedTags(ref HtmlDocument doc, string tagName, bool hasInnerText = false)
{
HtmlNode tagReplacement = null;
foreach(var tag in doc.DocumentNode.SelectNodes("//"+tagName)
{
tagReplacement = HtmlTextNode.CreateNode("<fix_"+tagName+"></fix_"+tagName+">");
foreach(var attr in tag.Attributes)
{
tagReplacement.SetAttributeValue(attr.Name, attr.Value);
}
if(hasInnerText)//for option tags and other non-empty nodes, the next (text) node will be its inner HTML
{
tagReplacement.InnerHtml = tag.InnerHtml + tag.NextSibling.InnerHtml;
tag.NextSibling.Remove();
}
tag.ParentNode.ReplaceChild(tagReplacement, tag);
}
}
Là một lưu ý, nếu tôi là một người đàn ông cá cược tôi sẽ đoán rằng câu trả lời của MikeBridge trên vô tình xác định nguồn gốc của lỗi này trong gói - điều gì đó đang gây ra các cờ đóng và rỗng để loại trừ lẫn nhau
Ngoài ra, sau khi đào sâu hơn một chút, tôi không phải là người duy nhất đã thực hiện phương pháp này:
Hơn nữa, trong trường hợp bạn CHỈ cần các phần tử không trống, có một bản sửa lỗi rất đơn giản được liệt kê trong cùng một câu hỏi, cũng như thảo luận mã hóa HAP tại đây: http://htmlagilitypack.codeplex.com/discussions/14982?ProjectName=htmlagilitypack Điều này về cơ bản đặt tùy chọn cờ trống được liệt kê trong câu trả lời của MikeBridge ở trên vĩnh viễn ở khắp mọi nơi.
một vấn đề với phương pháp này là các thực thể được mã hóa trước đây, như không gian phanh, được mã hóa, đây có thể là hành vi không mong muốn – MJJames