2008-10-28 11 views
5

हाल ही में मैं किसी दिए गए XPath और विशेषता के लिए XML फ़ाइल को पार्स करने के लिए XPathDocument और XNavigator का उपयोग कर रहा हूं। यह बहुत अच्छा काम कर रहा है, जब मैं पहले से जानता हूं कि XPath क्या है।एक्सएमएल फ़ाइल में एक्सपीएथ अस्तित्व के लिए सबसे अच्छा तरीका परीक्षण?

कभी-कभी, XPath कई संभावित XPath मानों में से एक होगा, और मैं परीक्षण करने में सक्षम होना चाहता हूं कि दिया गया XPath मौजूद है या नहीं।

मामले में मैं नामकरण गलत हो रही है, यहाँ क्या मैं एक XPath फोन कर रहा हूँ है - इस एक्सएमएल ब्लॉब दिया:

<foo> 
    <bar baz="This is the value of the attribute named baz"> 
</foo> 

मैं क्या मैं "का एक XPath फोन कर रहा हूँ की तलाश में हो सकता है// foo/bar "और फिर मान प्राप्त करने के लिए विशेषता" baz "पढ़ना। कोड है कि मैं यह करने के लिए उपयोग किए जाने वाले

उदाहरण:

XPathDocument document = new XPathDocument(filename); 
XPathNavigator navigator = document.CreateNavigator(); 
XPathNavigator node = navigator.SelectSingleNode("//foo/bar"); 
if(node.HasAttributes) 
{ 
    Console.WriteLine(node.GetAttribute("baz", string.Empty)); 
} 

अब, अगर navigator.SelectSingleNode करने के लिए कॉल विफल रहता है, यह एक NullReferenceException या एक XPathException वापस आ जाएगी। मैं उन दोनों को पकड़ सकता हूं और ऊपर दिए गए परीक्षण को यह देखने के लिए उपरोक्त प्रतिक्रिया देता हूं कि दिया गया XPath अपवाद देता है, लेकिन मैं सोच रहा था कि कोई बेहतर तरीका है या नहीं?

मुझे इंटेलिसेंस में कुछ भी स्पष्ट नहीं दिखाई दिया। XPathNavigator में हैसएट्रिब्यूट्स और हैस चिल्ड्रेन लेकिन एक समय में एक नोड पथ के माध्यम से पुनरावृत्ति करने से कम, मुझे उपयोग करने के लिए कुछ भी अच्छा नहीं दिखता है।

+0

क्या इस LINQ के साथ क्या करना है? XPathNavigator और XPathDocument LINQ से XML तक का हिस्सा नहीं हैं। –

उत्तर

10

आप मान्य XPath दी है, लेकिन यह कुछ भी मेल नहीं खाती है, SelectSingleNode नहीं फेंक एक NullReferenceException होगा - यह सिर्फ अशक्त वापस आ जाएगी।

यदि आप SelectSingleNode कुछ वाक्य रचनात्मक रूप से अमान्य XPath पास करते हैं, तो यह XPathException फेंक देगा।

तो आम तौर पर, आपको केवल यह जांचने की आवश्यकता होगी कि लौटाया गया मूल्य शून्य था या नहीं।

+0

यही वह है जिसे मैं ढूंढ रहा था, धन्यवाद। –

0

स्मृति से, इसमें त्रुटियां हो सकती हैं।

XDocument doc = XDocument.Load("foo.xml"); 

var att = from a in doc.Descendants("bar") 
      select a.Attribute("baz") 

foreach (var item in att) { 
    if (item != null) { ... } 
} 
+0

चूंकि प्रश्न शीर्षक लिंक्स का उल्लेख करता है, यहां मैं यह कैसे करूंगा। –

+0

उपयोग करें।क्वेरी पर FirstOrDefault यदि आप केवल एक –

0

तो node == null तो node.HasAttributes एक NullReferenceException फेंक देते हैं। यह स्थिति तब होगी जब //foo/bar XML दस्तावेज़ में किसी भी तत्व से मेल नहीं खाता है।

0
var node = XDocument.Load(filename) 
        .Descendants("bar") 
        .SingleOrDefault(e=>e.Attribute("baz") != null); 

if (node != null) Console.WriteLine(node.Attribute("baz").Value); 
1
var baz = navigator.SelectSingleNode("//foo/bar/@baz"); 
if (baz != null) Console.WriteLine(baz); 
0

मैं शायद अपने xpath में और अधिक विशिष्ट हो जाएगा।

 var doc = XDocument.Load(fileName); 

     var results = from r in doc.XPathSelectElements("/foo/bar[count(@baz) > 0]") 
         select r.Attribute("baz"); 

     foreach (String s in results) 
      Console.WriteLine(s); 
1

मुझे लगता है कि नेविगेटर निष्पादित करके XMLNode ऑब्जेक्ट बनाना अच्छा नहीं है। चयन करें SingleNode (...)।

आप navigator.Evaluate() के बजाय का उपयोग करना पड़:

if (Convert.ToBoolean(navigator.Evaluate(@"boolean(//foo/bar)"))) {...} 
+0

चाहते हैं तो मैंने प्रत्येक विधि 500,000 पुनरावृत्तियों के लिए SelectSingleNode की तुलना में इस विधि की गति तुलना की है (XPath अभिव्यक्ति के साथ एक स्ट्रिंग, असम्पीडित)। Boulan विधि से SelectSingleNode विधि 16-18% तेज थी। मैंने परीक्षण कई बार दोहराया है और परिणाम सुसंगत हैं। –

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