2012-05-14 20 views
15

यह मेरे दस्तावेज़ में मेरे सभी <li> तत्वों को क्यों चुनता है?एचटीएमएल एजिलिटी पैक, नोड से चयन नोड

HtmlWeb web = new HtmlWeb(); 
HtmlDocument doc = web.Load(url); 

var travelList = new List<Page>(); 
var liOfTravels = doc.DocumentNode.SelectSingleNode("//div[@id='myTrips']") 
        .SelectNodes("//li"); 

मैं क्या चाहता हूँ "myTrips" का एक id साथ <div> में सभी <li> तत्वों प्राप्त करने के लिए है।

उत्तर

15

यह थोड़ा उलझन में है क्योंकि आप उम्मीद कर रहे हैं कि यह आईडी "myTrips" के साथ केवल div पर एक चयन नोड्स करेगा, हालांकि यदि आप कोई अन्य SelectNodes ("// li") करते हैं तो यह शीर्ष से दूसरी खोज करेगा दस्तावेज़ का।

मैंने इसे एक में कथन के संयोजन से तय किया, लेकिन यह केवल उस वेबपृष्ठ पर काम करेगा जहां आपके पास एक आईडी "mytrips" के साथ केवल एक div है। क्वेरी इस तरह दिखेगी:

दस्तावेज़। दस्तावेज़ नोड। चयन नोड्स ("// div [@ id = 'myTrips'] // li");

4

आप एक LINQ क्वेरी के साथ ऐसा कर सकते हैं:

HtmlWeb web = new HtmlWeb(); 
HtmlDocument doc = web.Load(url); 

var travelList = new List<HtmlNode>(); 
foreach (var matchingDiv in doc.DocumentNode.DescendantNodes().Where(n=>n.Name == "div" && n.Id == "myTrips")) 
{ 
    travelList.AddRange(matchingDiv.DescendantNodes().Where(n=> n.Name == "li")); 
} 

मुझे आशा है कि यह मदद करता है

1

यह मेरे लिए काउंटर सहज ज्ञान युक्त लगता है अच्छी तरह से, यदि आप एक विशेष नोड मैंने सोचा पर एक selectNodes विधि चलाने यह केवल उस नोड के नीचे सामान की खोज करेगा, सामान्य रूप से दस्तावेज़ में नहीं।

वैसे भी ओपी यदि आप इस पंक्ति को बदलते हैं: var liOfTravels = doc.DocumentNode.SelectSingleNode ("// div [@ id = 'myTrips']")। SelectNodes ("// li");

TO: var liOfTravels = doc.DocumentNode.SelectSingleNode ("// div [@ id = 'myTrips']")। SelectNodes ("li");

मुझे लगता है कि आप ठीक होंगे, मेरे पास अभी भी एक ही समस्या है और यह मेरे लिए तय है। मुझे यकीन नहीं है कि यद्यपि ली को आपके पास नोड का प्रत्यक्ष बच्चा होना होगा।

12
var liOfTravels = doc.DocumentNode.SelectSingleNode("//div[@id='myTrips']") 
       .SelectNodes(".//li"); 

दूसरी पंक्ति में बिंदु नोट करें। मूल रूप से इस संबंध HTMLAgitilityPack पूरी तरह से XPath वाक्य रचना पर निर्भर करता है में, फिर भी परिणाम गैर सहज है, क्योंकि उन प्रश्नों को प्रभावी ढंग से एक ही कर रहे हैं:

doc.DocumentNode.SelectNodes("//li"); 
some_deeper_node.SelectNodes("//li"); 
+0

मुझे नहीं लगता कि प्रश्न समान हैं। असल में जब वह पहला चयन करता है "// div [@ id = 'myTrips']" वर्तमान नोड बदलता है। यही कारण है कि दूसरा चयन ".//li" (वर्तमान नोड से कहीं भी) होना चाहिए और "// li" (रूट से कहीं भी नहीं) होना चाहिए। चपलता वास्तव में क्या करने की उम्मीद है। – derloopkat

+0

@derloopkat, वे ** ** समान हैं (यहां कोई IMHO नहीं है; यदि वे नहीं थे तो आप समाधान क्वेरी में डॉट छोड़ सकते हैं, लेकिन आप नहीं कर सकते, क्या आप कर सकते हैं?)। दुर्भाग्यवश HTMLAgilityPack रूट से खोज करता है, भले ही आप किस नोड पर हों। आईएमएचओ भाग यह है - आम तौर पर दिए गए नोड पर ध्यान केंद्रित करने का बिंदु यह है कि आप ** से उस नोड को खोज जारी रखते हैं, न कि रूट से। दूसरी उप-क्वेरी में जोड़े गए डॉट के बिना समाधान क्वेरी बिल्कुल समझ में नहीं आती है, इस प्रकार सवाल है कि उनका समर्थन क्यों किया जाता है? – greenoldman

+0

हम विभिन्न चीजों के बारे में बात कर रहे हैं। जब मैंने कहा कि प्रश्न समान नहीं हैं तो मैं "// li" और ".//li" के बारे में बात कर रहा था। "उन प्रश्नों" से आप नीचे दिए गए प्रश्नों का संदर्भ लेंगे। – derloopkat

5

एक नए नोड बनाना कुछ स्थितियों में फायदेमंद हो सकता है और मदद से आप xpaths का उपयोग अधिक सहजता से। मैंने इसे कुछ स्थानों में उपयोगी पाया है।

var myTripsDiv = doc.DocumentNode.SelectSingleNode("//div[@id='myTrips']"); 
var myTripsNode = HtmlNode.CreateNode(myTripsDiv.InnerHtml); 
var liOfTravels = myTripsNode.SelectNodes("//li"); 
संबंधित मुद्दे