2012-01-20 13 views
5

Tôi đang cố gắng xây dựng một công cụ tìm kiếm đơn giản bằng cách sử dụng HtmlAgilityPack và Xpath với C# (.NET 4). Tôi muốn tìm mọi nút chứa từ tìm kiếm do người dùng xác định, nhưng dường như tôi không thể có được quyền XPath. Ví dụ:Sử dụng Xpath và HtmlAgilityPack để tìm tất cả các phần tử có innertext có chứa một từ hoặc từ cụ thể

<HTML> 
<BODY> 
    <H1>Mr T for president</H1> 
    <div>We believe the new president should be</div> 
    <div>the awsome Mr T</div> 
    <div> 
    <H2>Mr T replies:</H2> 
    <p>I pity the fool who doesn't vote</p> 
    <p>for Mr T</p> 
    </div> 
    </BODY> 
</HTML> 

Nếu searchword quy định là "Mr T" Tôi muốn các nút sau: <H1>, Thứ hai <div>, <H2> và thứ hai <p>. Tôi đã thử nhiều biến thể của doc.DocumentNode.SelectNodes("//text()[contains(., "+ searchword +")]"); nhưng tôi luôn luôn dường như gió lên với mỗi nút duy nhất trong toàn bộ DOM.

Bất kỳ gợi ý nào để đưa tôi đi đúng hướng sẽ rất được đánh giá cao.

Trả lời

12

Sử dụng:

//*[text()[contains(., 'Mr T')]] 

này sẽ chọn tất cả các yếu tố trong tài liệu XML có một đứa con text-nút, trong đó có chuỗi 'Mr T'.

này cũng có thể được viết ngắn hơn như:

//text()[contains(., 'Mr T')]/.. 

này sẽ chọn phụ huynh (s) của bất kỳ nút văn bản có chứa chuỗi 'Mr T'.

+0

biểu hiện thứ hai của bạn phù hợp chính xác những gì OP nói rằng ông đã thử (ngoại trừ phần bổ sung '..'), vì vậy tôi không chắc tại sao anh ta nghĩ nó không hoạt động. –

+0

@ lwburk: Nó "không hoạt động, bởi vì nó chọn * nút văn bản * và anh ấy cần bố mẹ. –

+0

Phải, tôi hiểu, nhưng chắc chắn không chọn *" mọi nút trong toàn bộ DOM "* ( –

-1

Sử dụng như sau:

doc.DocumentNode.SelectNodes("//*[contains(text()[1], " + searchword + ")]") 

này sẽ chọn tất cả các yếu tố (*) mà đầu tiên text con (text()[1]) chứa searchword.

1

Theo XPath, nếu bạn muốn tìm một từ khóa cụ thể mà bạn cần phải làm theo định dạng ("keyword" là từ mà bạn muốn tìm kiếm):

// * [text() [chứa ]]

bạn cần phải làm theo các định dạng tương tự như trên trong C#, keyword là biến chuỗi bạn gọi số (, 'từ khóa'.): giải pháp

doc.DocumentNode.SelectNodes("//*[text()[contains(., '" + keyword + "')]]"); 
+0

Vui lòng thử giải thích câu trả lời của bạn với nhiều chi tiết hơn. Điều này sẽ không chỉ giúp OP, nhưng bất cứ ai khác trong tương lai có thể có cùng một vấn đề. –

0

Case-không nhạy cảm:

var xpathForFindText = "// * [text() [chứa (dịch (, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'),. '" + LowerFocusKwd + "')]]";

var result = doc.DocumentNode.SelectNodes (xpathForFindText);

Lưu ý:

Hãy cẩn thận, bởi vì lowerFocusKwd không được chứa các ký tự sau, bởi vì xpath sẽ ở định dạng xấu:

'