2011-12-29 11 views
8

द्वारा एक विशेषता का मान प्राप्त करें मेरे पास एक HTML दस्तावेज़ है और मैं इसे XPath के साथ पार्स करता हूं। मैं तत्व इनपुट का मूल्य प्राप्त करना चाहता हूं, लेकिन यह काम नहीं करता है।XPath और HtmlAgilityPack

मेरे एचटीएमएल:

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

मेरे कोड:

using HtmlAgilityPack; 

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

तो मैं मूल्य प्राप्त करना चाहते हैं: (और मैं के साथ एक और टैग प्राप्त करने के लिए कोई आपत्ति नहीं है "10,743" उत्तर।)

+0

क्या आपने 'नोड [0]। वैल्यू' का प्रयास किया था? – Oded

+0

नहीं, क्योंकि मैं 'नोड [0] .nernerText' –

+1

द्वारा मान प्राप्त करना चाहता हूं लेकिन एक विशेषता में' इनरटेक्स्ट 'नहीं है। – Oded

उत्तर

6

अद्यतन 2: यहां एक कोड उदाहरण है एचटीएमएल एजिलिटी पैक का उपयोग करके विशेषताओं के मूल्य कैसे प्राप्त करें:

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"); 

आप स्पष्ट रूप से अपनी आवश्यकताओं के लिए इस कोड अनुकूलित करने की आवश्यकता - उदाहरण के लिए आप विशेषताओं में बदलाव नहीं करेगी, लेकिन सिर्फ att.Value का प्रयोग करेंगे।


अद्यतन: आप भी इस प्रश्न पर विचार कर सकता:

Selecting attribute values with html Agility Pack


आपकी समस्या है सबसे अधिक संभावना एक डिफ़ॉल्ट नाम स्थान समस्या - "XPath के लिए खोज डिफ़ॉल्ट नामस्थान सी # "और आपको कई अच्छे समाधान मिलेंगे (संकेत: 01 के अधिभार का उपयोग करें जिसमें XmlNamespaceManager तर्क है)।

निम्न कोड से पता चलता एक एक दस्तावेज़ में एक विशेषता के लिए क्या हो जाता है में "कोई नाम स्थान":

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); 

    } 
} 

इस एप्लिकेशन को चलने से परिणाम है:

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

अब, एक दस्तावेज़ के लिए जो डिफ़ॉल्ट नामस्थान में है:

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); 

    } 
} 

इस अनुप्रयोग चल रहा है फिर से वांछित परिणाम पैदा करता है:

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

धन्यवाद, लेकिन यह समस्या नहीं है, मेरा डॉक्टर एचटीएमएल है, और दूसरा XPath डो अच्छा है, इसके अलावा - क्योंकि यह XPath मेरे इरादे के लिए सही नहीं है। मुझे एक और XPath खोजने की जरूरत है, लेकिन मुझे कोई जानकारी नहीं है। –

+0

क्या मैं स्पष्ट नहीं था? वैसे भी मैंने ** सभी ** मेरे कोड को जोड़ा और लिखा कि मैं क्या चाहता हूं: स्ट्रिंग: "** 10743 **" (नोड इनपुट का मूल्य) –

+0

@ कानिपोज़: मेरा दूसरा अपडेट देखें - एक कोड नमूना बिल्कुल दिखा रहा है एचटीएमएल एजिलिटी पैक का उपयोग करके एक विशेषता के मूल्य को कैसे प्राप्त करें - कुछ ऐसा जो आप आसानी से अपनी आवश्यकताओं के अनुरूप कर सकते हैं। –

14

आप .Attributes संग्रह में प्राप्त कर सकते हैं:

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

तुम भी सीधे विशेषता प्राप्त कर सकते हैं अगर आप 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;