2008-11-16 29 views
22

Tôi đang sử dụng HtmlAgilityPack. Tôi tạo một HtmlDocument và LoadHtml bằng chuỗi sau:HtmlAgilityPack Drops Tùy chọn Thẻ kết thúc

<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One</option><option value="2">Two</option></select> 

Điều này làm một số điều bất ngờ. Đầu tiên, nó cung cấp cho hai lỗi phân tích cú pháp, EndTagNotRequired. Thứ hai, nút chọn có 4 trẻ em - hai cho các thẻ tùy chọn và hai nút khác cho văn bản bên trong của các thẻ tùy chọn. Cuối cùng, OuterHtml giống như sau:

Vì vậy, về cơ bản, tôi quyết định thả thẻ đóng trên các tùy chọn. Hãy để dành một chút cho dù nó là thích hợp và mong muốn để làm điều đó. Tôi đang sử dụng HtmlAgilityPack để kiểm tra mã tạo HTML, vì vậy tôi không muốn nó đưa ra bất kỳ quyết định nào cho tôi hoặc đưa ra bất kỳ lỗi nào trừ khi HTML thực sự không đúng định dạng. Có cách nào để làm cho nó hoạt động như thế nào tôi muốn? Tôi đã thử đặt một số tùy chọn cho HtmlDocument, cụ thể:

doc.OptionAutoCloseOnEnd = false; 
doc.OptionCheckSyntax = false; 
doc.OptionFixNestedTags = false; 

Điều này không hoạt động. Nếu HtmlAgilityPack không thể làm những gì tôi muốn, bạn có thể giới thiệu một cái gì đó có thể?

+0

cho bất cứ ai khác phải đối mặt với vấn đề này, xem câu trả lời của tôi trên http://stackoverflow.com/questions/759355/image-tag-not -closing-with-htmlagilitypack/12096383 # 12096383 cho phương pháp thiết lập câu trả lời của bobnce mà không sửa đổi nguồn HAP. – MaxPRafferty

Trả lời

30

Lỗi chính xác tương tự được báo cáo trong cuộc thảo luận của trang chủ HAP, nhưng có vẻ như không có bản sửa lỗi có ý nghĩa nào được thực hiện cho dự án sau một vài năm. Không khuyến khích.

Một trình duyệt nhanh chóng của các nguồn gợi ý các lỗi có thể là fixable bằng cách bình luận ra dòng 92 của HtmlNode.cs:

// they sometimes contain, and sometimes they don 't... 
ElementsFlags.Add("option", HtmlElementFlag.Empty); 

(Trên thực tế không có, họ luôn chứa văn bản nhãn, mặc dù một chuỗi trống sẽ cũng được văn bản hợp lệ. Một tác giả bất cẩn có thể bỏ qua khi kết thúc-tag, nhưng sau đó đó là sự thật của bất kỳ yếu tố.)

ADD

Một giải pháp tương đương được gọi HtmlNode.ElementsFlags.Remove("option"); trước Bất kỳ việc sử dụng tự do nào (không cần phải sửa đổi mã nguồn tự do)

+0

Tuyệt vời. Cảm ơn rất nhiều. Hoạt động tuyệt vời! –

+2

Tôi đã gặp sự cố này trong khi cố gắng lấy giá trị InnerText của tùy chọn. Tôi đã áp dụng giải pháp của bạn trực tiếp trong mã của tôi bằng cách sử dụng HashTable tiếp xúc của HtmlNode tĩnh: HtmlNode.ElementsFlags.Remove ("option"); –

+0

Xin chào Jason, làm cách nào bạn thực sự giải quyết vấn đề này trực tiếp trong mã của riêng bạn? Tôi đã thử HtmlNode.ElementsFlags.Xóa ("tùy chọn"); trong mã của tôi nhưng nó không giải quyết được vấn đề thẻ img không đóng? Bạn có thể cho tôi chi tiết xin vui lòng, tôi không muốn sửa đổi và biên dịch lại nguồn trừ khi tôi phải. Cảm ơn rất nhiều! –

5

Dường như có một số lý do không phân tích thẻ Tùy chọn dưới dạng thẻ "chung", để tuân thủ XHTML, tuy nhiên điều này có thể là một nỗi đau thực sự cổ.

Đề nghị của tôi là để làm một toàn bộ chuỗi thay thế và thay đổi tất cả "tùy chọn" thẻ để "my_option" thẻ, như vậy bạn:

  1. Đừng phải sửa đổi mã nguồn của thư viện (và có thể nâng cấp sau).
  2. Có thể phân tích cú pháp như bình thường.

Các bài gốc trên HtmlAgilityPack diễn đàn có thể được tìm thấy tại địa chỉ: http://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=14982

Các vấn đề liên quan