2010-03-05 31 views
22

HTML mẫu: MãLàm thế nào để có được tất cả các yếu tố đầu vào trong một hình thức với HtmlAgilityPack mà không nhận được một lỗi tham chiếu null

<html><body> 
    <form id="form1"> 
     <input name="foo1" value="bar1" /> 
     <!-- Other elements --> 
    </form> 
    <form id="form2"> 
     <input name="foo2" value="bar2" /> 
     <!-- Other elements --> 
    </form> 
</body></html> 

Test:

HtmlDocument doc = new HtmlDocument(); 
doc.Load(@"D:\test.html"); 
foreach (HtmlNode node in doc.GetElementbyId("form2").SelectNodes(".//input")) 
{ 
    Console.WriteLine(node.Attributes["value"].Value);    
} 

Tuyên bố doc.GetElementbyId("form2").SelectNodes(".//input") mang lại cho tôi một tham chiếu null.

Mọi thứ tôi đã làm sai? cảm ơn.

Trả lời

40

Bạn có thể làm như sau:

HtmlNode.ElementsFlags.Remove("form"); 

HtmlDocument doc = new HtmlDocument(); 

doc.Load(@"D:\test.html"); 

HtmlNode secondForm = doc.GetElementbyId("form2"); 

foreach (HtmlNode node in secondForm.Elements("input")) 
{ 
    HtmlAttribute valueAttribute = node.Attributes["value"]; 

    if (valueAttribute != null) 
    { 
     Console.WriteLine(valueAttribute.Value); 
    } 
} 

Theo mặc định HTML Agility Pack phân tích các hình thức như nút trống rỗng, vì họ được phép chồng chéo các phần tử HTML khác. Dòng đầu tiên, (HtmlNode.ElementsFlags.Remove("form");) vô hiệu hóa hành vi này cho phép bạn lấy các phần tử đầu vào bên trong biểu mẫu thứ hai.

Cập nhật: Ví dụ về các yếu tố hình thức chồng chéo:

<table> 
<form> 
<!-- Other elements --> 
</table> 
</form> 

Yếu tố bắt đầu bên trong một bảng nhưng đã bị đóng bên ngoài các yếu tố bảng. Điều này được cho phép trong đặc tả HTML và HTML Agility Pack phải xử lý nó.

+0

Điều này có nghĩa là, trừ khi bạn sử dụng 'HtmlNode.ElementsFlags.Remove (" form ");', không thể phân tích cú pháp các phần tử 'form' thông qua HAP? –

+0

@Kevin, tôi không có kiến ​​thức về bất kỳ giải pháp thay thế nào khác. –

+1

5 năm sau - vẫn là một yêu cầu, vẫn là câu trả lời đúng. Ngoài ra, vẫn phải được thay đổi trong chính gói đó ... – getglad

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