2010-04-07 9 views
22

मैं एक्सएमएल फ़ाइल को पढ़ने के लिए XDocument के साथ LINQ का उपयोग कर रहा हूं।एक्सडी दस्तावेज़ और लिंक का उपयोग कर एक्सएमएल पढ़ना - जांचें कि तत्व शून्य है या नहीं?

XDocument xml = XDocument.Load(filename); 

var q = from b in xml.Descendants("product") 
     select new 
     { 
      name = b.Element("name").Value, 
      price = b.Element("price").Value,      
      extra = b.Element("extra1").Value, 
      deeplink = b.Element("deepLink").Value     
     }; 

अब समस्या है, extra1 क्षेत्र हमेशा मौजूद नहीं है: यह कोड है। उस नोड के बिना एक्सएमएल फ़ाइल में आइटम हैं। यदि ऐसा होता है तो यह NullReferenceException के साथ क्रैश हो रहा है।

क्या "चेक अगर शून्य" शामिल करने की कोई संभावना है तो मैं इसे क्रैश होने से रोक सकता हूं?

उत्तर

41

उपयोग .Value के बजाय (string):

var q = from b in xml.Descendants("product") 
     select new 
     { 
      name = (string)b.Element("name"), 
      price = (double?)b.Element("price"),      
      extra = (string)b.Element("extra1"), 
      deeplink = (string)b.Element("deepLink")     
     }; 

यह भी, other datatypes साथ काम करता है के मामले में कई नल प्रकार तत्व हमेशा मौजूद नहीं है भी शामिल है।

+5

+1 - दिलचस्प। समझने के लिए – womp

7

आप "अशक्त कोलेसिंग" ऑपरेटर का उपयोग कर सकते हैं:

var q = from b in xml.Descendants("product") 
     select new 
     { 
      name = (string)b.Element("name") ?? "Default Name", 
      price = (double?)b.Element("price") ?? 0.0,      
      extra = (string)b.Element("extra1") ?? String.Empty, 
      deeplink = (string)b.Element("deepLink") ?? String.Empty     
     }; 

इस तरह, आप का इस्तेमाल किया जब वहाँ कोई तत्व है डिफ़ॉल्ट मान के बारे में पूरा नियंत्रण होगा।

+2

'कीमत' को' डबल 'होने की आवश्यकता है। – AakashM

1

XDocument का उपयोग कर XML फ़ाइल पढ़ने के लिए यहां नमूना उदाहरण है।

XDocument objBooksXML = XDocument.Load(Server.MapPath("books.xml")); 
    var objBooks = from book in 
        objBooksXML.Descendants("Book") 
        select new { 
           Title = book.Element("Title").Value, 
           Pages = book.Element("Pages").Value 
           }; 

    Response.Write(String.Format("Total {0} books.", objBooks.Count())); 
    gvBooks.DataSource = objBooks; 
    gvBooks.DataBind(); 
+0

इस कोड के साथ समस्या यह है कि यदि "पुस्तक" में "शीर्षक" या "पृष्ठ" तत्व नहीं होता है तो आप प्राप्त करने का प्रयास करते समय एक शून्य अपवाद फेंक देंगे। उनमें से किसी से मूल्य। – Bil

2

उस तत्व का उपयोग करने से पहले किसी भी तत्व के अस्तित्व की जांच के लिए निम्न उदाहरण का उपयोग करें।

if(b.Elements("extra1").Any()) 
{ 
    extra = b.Element("extra1").Value; 
} 
संबंधित मुद्दे