2009-12-01 5 views
8

मैं वर्तमान में सभी टीआर कि एक टीडी कि 'User Name' या 'User Name' या ' User Name ' लेकिन इसके काम नहीं कर शामिल होते हैं पाने के लिए निम्न xpathसामान्यीकृत-स्पेस() xpath फ़ंक्शन को काम करने के लिए कैसे प्राप्त करें?

//tr[normalize-space(td/text())='User Name'] 

कोशिश कर रहा हूँ और मैं नहीं जानता कि क्या क्वेरी के साथ कुछ गलत है :(
डेटा मैं पता लगाना चाहते हैं निम्न स्वरूप में है

<tr><td>User Name</td></tr> 
<tr><td>User  Name</td></tr> 
<tr><td> User Name </td></tr> 

तो सही प्रारूप इस xpath क्वेरी लिखने के लिए क्या है?

संपादित करें: यह अगर डेटा तो अब मैं कैसे xpath क्वेरी लिख सकते हैं निम्न स्वरूप

<tr><td>x</td><td>User Name</td></tr> 
<tr><td>x</td><td>y</td><td>User  Name</td></tr> 
<tr><td>x</td><td>y</td><td>z</td><td> User Name </td></tr> 

में है काम नहीं लगते?
नोट: "// tr [normalize-space (td/text()) = 'उपयोगकर्ता नाम']" काम नहीं करेगा
लेकिन "// tr/td [normalize-space (text()) = 'उपयोगकर्ता का नाम '] "काम करेंगे (लेकिन मैं और टीआर प्राप्त करना चाहते हैं नहीं टीडी तत्व)

+0

कृपया 'से शुरू होने पर अपने इनपुट डेटा का नमूना दिखाएं। –

+0

@ पावेल मिनेव: हो गया :) – Karim

+0

सब कुछ पहली नज़र में ठीक दिखता है। मुझे संदेह है कि समस्या क्वेरी के साथ नहीं है, लेकिन आप परिणामों का उपयोग कैसे करते हैं। क्या आप संदर्भ में क्वेरी दिखा सकते हैं - यदि यह एक्सएसएलटी है, तो एक्सएसएलटी कोड जो इसे कॉल करता है और परिणामों का उपयोग करता है, यदि यह सी # कोड सीधे है, तो वह कोड। –

उत्तर

26

अब जब आपने प्रश्न संपादित किया है, तो यह समझ में आता है। के इस इनपुट पर विचार करें:

<tr><td>x</td><td>User Name</td></tr> 

और अपने गैर काम कर क्वेरी:

//tr[normalize-space(td/text()) = 'User Name'] 

अब, td/text() का अर्थ है "सभी बच्चे वर्तमान नोड के td नोड्स के सभी बच्चे पाठ नोड्स का चयन करें"। इस मामले में यह एक नोड-सेट उत्पन्न करेगा जिसमें दो टेक्स्ट नोड्स, x और User Name शामिल होंगे।

अब आप उस नोड-सेट पर normalize-space() पर कॉल करें। normalize-space() का एकमात्र तर्क प्रकार string? है। के बाद से एक नोड-सेट एक स्ट्रिंग नहीं है, रूपांतरण, में लात XPath 1.0 सिफारिश के section 3.2 प्रति:

एक तर्क के रूप में करता है, तो स्ट्रिंग() फ़ंक्शन को कॉल करके स्ट्रिंग टाइप करने के लिए बदल जाती है।

अब खंड 4.2 में स्ट्रिंग() की definition को देखो:

एक नोड सेट नोड सेट में नोड के स्ट्रिंग-मूल्य वापस लौट कर एक स्ट्रिंग में बदल जाती है यह दस्तावेज़ ऑर्डर में पहला है। यदि नोड-सेट खाली है, तो खाली स्ट्रिंग लौटा दी जाती है।

हमारे उदाहरण में, "दस्तावेज़ ऑर्डर में" पहला नोड टेक्स्ट नोड x है, इसलिए यह वह होगा जिसका उपयोग किया जाएगा; दूसरा नोड अनदेखा किया जाता है। इस प्रकार, आप normalize-space('x') पर कॉल करना समाप्त कर देते हैं। स्वाभाविक रूप से, यह 'उपयोगकर्ता नाम' के बराबर तुलना नहीं करेगा।यह काम, उपयोग करने के लिए:

//tr[td[normalize-space(text()) = 'User Name']] 

इस रूप में लिखित जा सकता है "सभी tr नोड्स है कि बच्चे td नोड्स का चयन करें, पहले बच्चे text() नोड जिनमें से User Name की एक सामान्यीकृत स्ट्रिंग मान है" - जो क्या है आप चाहते हैं। नो-तर्क normalize-space() के बाद से

//tr[td[normalize-space() = 'User Name']] 

(जो td हो जाएगा) वर्तमान नोड के लिए लागू होगा, और भीतर सभी पाठ नोड्स पर कार्रवाई: इसके अलावा, आप को यह सरल बना सकते हैं।

1

यह यहाँ ठीक काम करता है:

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml(@" 
    <table> 
     <tr><td>User Name</td></tr> 
     <tr><td> User Name </td></tr> 
     <tr><td> User Name </td></tr> 
    </table>"); 

Console.WriteLine(
    xmlDoc.SelectNodes(
     "//tr[td[normalize-space(.) = 'User Name']]").Count); // shows "3" 

आप एक वास्तविक एक्सएमएल नमूने के साथ अपने प्रश्न अपडेट कर लें कर सकते हैं?

+0

actuall फ़ाइल एक बड़ा है इसलिए अपलोड करने के लिए यह संभव नहीं है। लेकिन नमूना आपके जैसा है लेकिन यह मेरे लिए काम नहीं कर रहा है, लेकिन यह मेरे लिए काम नहीं कर रहा है – Karim

+0

आपको पूरी फ़ाइल अपलोड करने की आवश्यकता नहीं है, केवल छोटी टुकड़ा जहां आपको समस्याएं हैं –

+0

अच्छी तरह से मुझे पता चला कि समस्या थी और मैंने अपना नमूना – Karim

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