2012-11-05 16 views
6

मैं स्क्रिप्ट नोड्स और उल के अलावा नोड्स का चयन करने की कोशिश कर रहा हूं जिसमें 'सापेक्षनाव' नामक कक्षा है। क्या कोई मुझे सही रास्ते पर निर्देशित कर सकता है? मैं इसे एक सप्ताह के लिए खोज रहा हूं और मुझे इसे कहीं भी नहीं मिला है। वर्तमान में मेरे पास यह है लेकिन यह स्पष्ट रूप से // ul [@ class = 'relativeNav'] का चयन कर रहा है। क्या इसके बारे में कोई अभिव्यक्ति नहीं है ताकि चयन नोड उस पर ध्यान न दे?HtmlAgilityPack SelectNodes अभिव्यक्ति किसी तत्व के साथ किसी तत्व को अनदेखा करने के लिए

HtmlDocument doc = new HtmlDocument(); 
var nodesToExclude1 = doc.DocumentNode.SelectNodes("//ul[@class='relativeNav']"); 
var nodesToExclude2 = doc.DocumentNode.SelectNodes("//body//script"); 
var requiredNodes = doc.DocumentNode.SelectNodes("//") 
         .Where(node => !nodesToExclude1.Contains(node) && 
             !nodesToExclude2.Contains(node)); 

foreach (HtmlNode node in requiredNodes) 
{ 
    Console.WriteLine("Node: " + node); 
    singleString += node.InnerText.Trim() + "\n"; 
} 

उत्तर

4

एक संरचना के लिए इसी तरह के साथ एक HTML दस्तावेज को देखते हुए:

<html> 
<head><title>HtmlDocument</title> 
</head> 
<body> 
<div> 
<span>Hello Span World</span> 
<script> 
Script Text 
</script> 
</div> 
<ul class='relativeNav'> 
<li>Hello </li> 
<li>Li</li> 
<li>World</li> 
</ul> 
</body> 
</html> 

निम्नलिखित XPath अभिव्यक्ति सभी नोड्स जो नहीं कर रहे हैं का चयन करेंगे

 foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//body//*[not(self::script)]/text()")) 
     { 
      Console.WriteLine("Node: " + node); 
      singleString += node.InnerText.Trim() + "\n"; 
     } 
+0

आपका उत्तर वही था जो मैं खोज रहा था। XPath पर कुछ प्रकाश डालने के लिए धन्यवाद। – thaky

2

मैं इस आशा है कि आप क्या जरूरत है कक्षा 'रिश्तेदार' के साथ यूएल तत्वों के सभी बच्चों को छोड़कर स्क्रिप्ट तत्व:

var nodes = htmlDoc.DocumentNode.SelectNodes("//body//*[not(parent::ul[@class='relativeNav']) and not(self::script)]/text()"); 

अद्यतन: कि उनकी गहराई से प्रभावित हुए बिना आप का उपयोग करना चाहिए अगर आप उल [class = 'relativeNav'] के किसी भी बच्चों को बाहर करने की आवश्यकता उल्लेख करना भूल गया:

"//body//*[not(ancestor::ul[@class='relativeNav']) and not(self::script)]/text()" 

आप उल तत्व को बाहर करने के साथ ही चाहता है तो (कुछ ऊपर के बाद से तत्व पाठ नहीं है उदाहरण में अप्रासंगिक) आप निर्दिष्ट करना चाहिए:

"//body//*[not(ancestor-or-self::ul[@class='relativeNav']) and not(self::script)]" 
+0

यह एक दिया "XPathException: अभिव्यक्ति एक नोड-सेट करने के लिए मूल्यांकन करना चाहिए" जब मैं इस "var requiredNodes = दस्तावेज़ का उपयोग करें। DocumentNode.SelectNodes ("//")। कहाँ (node ​​=>! NodesToExclude.Contains (नोड)); "। इसके अलावा मेरे पास "// body" का चयन करने के लिए केवल दो अन्य आवश्यकताएं हैं और स्क्रिप्ट "// * [नहीं (स्वयं :: स्क्रिप्ट)]/टेक्स्ट()" का चयन नहीं करना है। जब मैंने उन्हें आवश्यक नोड्स के चयन नोड्स के तहत रखा तो मुझे एक शून्य वस्तु अपवाद दिया। "var requiredNodes = doc.DocumentNode.SelectNodes (" // body // * [not (self :: script)]/text() ")। जहां (node ​​=>! nodesToExclude.Contains (node));" – thaky

+0

मेरा संपादित उत्तर देखें। –

+0

धन्यवाद। लिंक अभिव्यक्ति भविष्य में मेरे लिए आसान हो जाएगी। – thaky

संबंधित मुद्दे