9

Làm cách nào để chọn một phần tử, ví dụ: textbox nếu tôi không biết id của nó?GetElementsByTagName trong Htmlagilitypack

Nếu tôi biết id của nó sau đó tôi chỉ có thể viết:

HtmlAgilityPack.HtmlNode node = doc.GetElementbyId(id); 

Nhưng tôi không biết ID textbox và tôi không thể tìm thấy phương pháp getElementsByTagName trong HtmlAgilityPack trong đó có sẵn trong kiểm soát WebBrowser. Trong điều khiển trình duyệt web tôi có thể chỉ đơn giản viết:

HtmlElementCollection elements = browser[i].Document.GetElementsByTagName("form"); 
foreach (HtmlElement currentElement in elements) 
{ 

} 

EDIT

Dưới đây là hình thức HTML Tôi đang nói về

<form id="searchform" method="get" action="/test.php"> 
<input name="sometext" type="text"> 
</form> 

Xin lưu ý tôi không biết ID của biểu mẫu. Và có thể có một số biểu mẫu trên cùng một trang. Điều duy nhất tôi biết là "đôi khi" và tôi muốn có được yếu tố này chỉ sử dụng tên này. Vì vậy, tôi đoán tôi sẽ phải phân tích tất cả các hình thức một và sau đó tìm thấy tên này "sometext" nhưng làm thế nào để tôi làm điều đó?

+0

tốt, những gì html trông như thế nào? có thể có một cách khác. – shriek

+0

@shriek Tôi đã chỉnh sửa câu hỏi của mình, vui lòng xem. – Ali

+0

Xem http://stackoverflow.com/a/3120867/68607 – TFD

Trả lời

26

Nếu bạn đang tìm kiếm các thẻ bằng cách tagname của nó (như form cho <form name="someForm">), sau đó bạn có thể sử dụng:

var forms = document.DocumentNode.Descendants("form"); 

Nếu bạn đang tìm kiếm thẻ theo thuộc tính tên của nó (chẳng hạn như someForm cho <form name="someForm">, thì bạn có thể sử dụng:

var forms = document.DocumentNode.Descendants().Where(node => node.Name == "formName"); 

Đối với người cuối cùng bạn có thể tạo ra một phương pháp mở rộng đơn giản:

public static class HtmlNodeExtensions 
{ 
    public static IEnumerable<HtmlNode> GetElementsByName(this HtmlNode parent, string name) 
    { 
     return parent.Descendants().Where(node => node.Name == name); 
    } 

    public static IEnumerable<HtmlNode> GetElementsByTagName(this HtmlNode parent, string name) 
    { 
     return parent.Descendants(name); 
    } 
} 

Lưu ý: Bạn cũng có thể sử dụng SelectNodes và XPath để truy vấn tài liệu của bạn:

var nodes = doc.DocumentNode.SelectNodes("//form//input"); 

sẽ cung cấp cho bạn tất cả các đầu vào trên trang có trong thẻ biểu mẫu.

var nodes = doc.DocumentNode.SelectNodes("//form[1]//input"); 

sẽ cung cấp cho bạn tất cả các nguyên liệu đầu vào của các hình thức đầu tiên trên trang

5

Tôi nghĩ rằng bạn đang tìm kiếm một cái gì đó như thế này

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
doc.LoadHtml("...."); 

var inputs = doc.DocumentNode.Descendants("input") 
    .Where(n => n.Attributes["name"]!=null && n.Attributes["name"].Value == "sometext") 
    .ToArray(); 
+0

Tôi đã chỉnh sửa câu hỏi của mình, vui lòng xem. – Ali

+0

@Ali Tôi đã cập nhật câu trả lời đã là –

+0

Không cần kiểm tra n.Attributes và tất cả. Có một thuộc tính Name. Bạn có thể sử dụng '.Where (n => n.Name == TheNameYoureLookingFor);' – jessehouwing

5

Bất kỳ nút theo tên:

doc.DocumentNode.SelectNodes("//*[@name='name']") 

nút Input theo tên:

doc.DocumentNode.SelectNodes("//input[@name='name']")