2011-12-29 50 views
8

Tôi có tài liệu HTML và tôi phân tích nó bằng XPath. Tôi muốn nhận được một giá trị của đầu vào phần tử, nhưng nó không hoạt động.Nhận giá trị của một thuộc tính bởi XPath và HtmlAgilityPack

My Html:

<tbody> 
    <tr> 
    <td> 
     <input type="text" name="item" value="10743" readonly="readonly" size="10"/> 
    </td> 
    </tr> 
</tbody> 

Mã của tôi:

using HtmlAgilityPack; 

HtmlAgilityPack.HtmlDocument doc; 
HtmlWeb hw = new HtmlWeb(); 
HtmlNodeCollection node = doc.DocumentNode.SelectNodes("//input/@value"); 
string s=node[0].InnerText; 

Vì vậy tôi muốn có được giá trị: "10.743" (và tôi không quan tâm để có được một thẻ với answer.)

+0

Bạn đã thử 'node [0] .Value'? – Oded

+0

Không, bởi vì tôi muốn nhận giá trị bằng nút '[0] .InnerText' –

+1

Nhưng một thuộc tính không có' InnerText'. – Oded

Trả lời

6

Update2: Dưới đây là ví dụ về cách lấy giá trị thuộc tính bằng Gói nhanh Agml:

http://htmlagilitypack.codeplex.com/wikipage?title=Examples

HtmlDocument doc = new HtmlDocument(); 
doc.Load("file.htm"); 
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"]) 
{ 
    HtmlAttribute att = link.Attributes["href"]; 
    att.Value = FixLink(att); 
} 
doc.Save("file.htm"); 

Bạn rõ ràng là cần phải thích ứng với mã này với nhu cầu của bạn - ví dụ, bạn sẽ không sửa đổi các thuộc tính, nhưng sẽ chỉ sử dụng att.Value.


Cập nhật: Bạn cũng có thể xem xét câu hỏi này:

Selecting attribute values with html Agility Pack


Vấn đề của bạn rất có thể là một vấn đề không gian tên mặc định - tìm kiếm cho "XPath không gian tên mặc định C# "và bạn sẽ tìm thấy nhiều giải pháp tốt (gợi ý: sử dụng quá tải của SelectNodes() có một đối số XmlNamespaceManager).

Các mã sau đây cho thấy những gì một được cho một thuộc tính trong một tài liệu "không gian tên":

using System; 
using System.IO; 
using System.Xml; 

public class Sample 
{ 

    public static void Main() 
    { 

     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml("<input value='novel' ISBN='1-861001-57-5'>" + 
        "<title>Pride And Prejudice</title>" + 
        "</input>"); 

     XmlNode root = doc.DocumentElement; 

     XmlNode value = doc.SelectNodes("//input/@value")[0]; 

     Console.WriteLine("Inner text: " + value.InnerText); 
     Console.WriteLine("InnerXml: " + value.InnerXml); 
     Console.WriteLine("OuterXml: " + value.OuterXml); 
     Console.WriteLine("Value: " + value.Value); 

    } 
} 

Kết quả từ chạy ứng dụng này là:

Inner text: novel 
InnerXml: novel 
OuterXml: value="novel" 
Value: novel 

Bây giờ, đối với tài liệu có trong không gian tên mặc định:

using System; 
using System.IO; 
using System.Xml; 

public class Sample 
{ 

    public static void Main() 
    { 

     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml("<input xmlns='some:Namespace' value='novel' ISBN='1-861001-57-5'>" + 
        "<title>Pride And Prejudice</title>" + 
        "</input>"); 

     XmlNode root = doc.DocumentElement; 

     XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); 
     nsmgr.AddNamespace("x", "some:Namespace"); 

     XmlNode value = doc.SelectNodes("//x:input/@value", nsmgr)[0]; 

     Console.WriteLine("Inner text: " + value.InnerText); 
     Console.WriteLine("InnerXml: " + value.InnerXml); 
     Console.WriteLine("OuterXml: " + value.OuterXml); 
     Console.WriteLine("Value: " + value.Value); 

    } 
} 

Chạy ứng dụng này tạo ra một lần nữa kết quả truy nã:

Inner text: novel 
InnerXml: novel 
OuterXml: value="novel" 
Value: novel 
+0

Cảm ơn, nhưng nó không phải là vấn đề, doc của tôi là Html, và một điều tốt khác của XPath, ngoại trừ điều đó - bởi vì XPath này không đúng cho ý định của tôi. Tôi cần tìm một XPath khác, nhưng tôi không biết. –

+0

Tôi không rõ ràng phải không? anyway tôi thêm ** tất cả ** mã của tôi và đã viết những gì tôi muốn: chuỗi: "** 10743 **" (giá trị của đầu vào nút) –

+0

@Chanipoz: Hãy xem bản cập nhật thứ hai của tôi - mẫu mã hiển thị chính xác làm thế nào để có được giá trị của một thuộc tính bằng cách sử dụng Html Agility Pack - một cái gì đó bạn có thể dễ dàng thích ứng với nhu cầu của bạn. –

14

bạn có thể lấy nó trong .Attributes bộ sưu tập:

var doc = new HtmlAgilityPack.HtmlDocument(); 
doc.Load("file.html"); 
var node = doc.DocumentNode.SelectNodes("//input") [0]; 
var val = node.Attributes["value"].Value; //10743 
5

Bạn cũng có thể trực tiếp lấy các thuộc tính nếu bạn sử dụng HtmlNavigator .

//Load document from some html string 
HtmlDocument hdoc = new HtmlDocument(); 
hdoc.LoadHtml(htmlContent); 

//load navigator for current document 
HtmlNavigator navigator = (HtmlNodeNavigator)hdoc.CreateNavigator(); 

//Get value with given xpath 
string xpath = "//input/@value"; 
string val = navigator.SelectSingleNode(xpath).Value; 
Các vấn đề liên quan