2013-01-26 32 views
9
<Employees> 
    <Employee> 
    <EmpId>1</EmpId> 
    <Name>Sam</Name> 
    <Sex>Male</Sex> 
    <Phone Type="Home">423-555-0124</Phone> 
    <Phone Type="Work">424-555-0545</Phone> 
    </Employee> 
</Employees> 

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 

     emplyeeDetails = XDocument.Load(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName + "\\LinqToXml\\Xmls\\" + "Employees.xml"); 
     var emplyees = from emp in emplyeeDetails.Descendants("Employee").Take(10) 
         orderby emp.Element("EmpId").Value ascending 
         select new 
         { 
          Id = emp.Element("EmpId").Value, 
          Name = emp.Element("Name").Value, 
          Sex = emp.Element("Sex").Value, 
          WorkPhone=emp.Element("Phone").Attribute("Type").Value, 
          HomePhone = emp.Element("Phone").Attribute("Type").Value,        

         }; 
     DgrdEmployeeDetails.ItemsSource = emplyees.ToList(); 
    } 

उपर्युक्त कोड का उपयोग करके मैं नीचे परिणाम प्राप्त कर सकता हूं। enter image description herelinq से xml का उपयोग करके विशेषता मान कैसे प्राप्त करें?

लेकिन मैं स्तंभ (WorkPhone) मूल्य 424-555-0545 बजायहोम और स्तंभ (Homephone) मूल्य 423-555-0124 बजायहोम की जरूरत । इसके लिए मुझे क्या करना चाहिए?

उत्तर

11

Where विधि का उपयोग करें:

emp.Elements("Phone").Single(phoneElement => phoneElement.Attribute("Type").Value == "Home").Value 

कार्य फोन नंबर के लिए::

emp.Elements("Phone").Single(phoneElement => phoneElement.Attribute("Type").Value == "Work").Value 
  • emp.Elements("Phone") एक enumer है

    होम फोन नंबर के लिए emp के सभी "फ़ोन" तत्वों पर सक्षम।

  • Single वह तत्व प्राप्त करेगा जो निर्दिष्ट संपत्ति को संतुष्ट करेगा (यदि 0 या 1 से अधिक तत्व हैं जो संपत्ति को संतुष्ट करते हैं, तो एक त्रुटि उठाई जाती है)।
  • phoneElement.Attribute("Type").Value विशेषता "प्रकार" (यानी "घर" या "काम")

तब का मूल्य है, अपने कोड होना चाहिए: तत्व emp नहीं हो सकता है

var emplyees = from emp in emplyeeDetails.Descendants("Employee").Take(10) 
       orderby emp.Element("EmpId").Value ascending 
       select new 
       { 
        Id = emp.Element("EmpId").Value, 
        Name = emp.Element("Name").Value, 
        Sex = emp.Element("Sex").Value, 
        WorkPhone = emp.Elements("Phone").Single(phoneElement => phoneElement.Attribute("Type").Value == "Home").Value, 
        HomePhone = emp.Elements("Phone").Single(phoneElement => phoneElement.Attribute("Type").Value == "Work").Value, 
       }; 

हैं कार्य फोन या घर फोन नंबर, उपरोक्त कोड Single में अपवाद बढ़ाएगा। इस मामले में आप के लिए अपने कोड बदलने के लिए से निपटने के लिए:

(string)emp.Elements("Phone").SingleOrDefault(phoneElement => phoneElement.Attribute("Type").Value == "Home") 

SingleOrDefaultnull बराबर अगर कोई "फ़ोन" तत्व हालत और एक XElement पर string कलाकारों को पूरा करेगा XElement.Value के बराबर है।

2

इस कोड काम करेंगे नहीं है, भले ही किसी भी Phone तत्वों कर्मचारी के लिए मौजूद हैं:

var emplyees = 
    from emp in emplyeeDetails.Descendants("Employee").Take(10) 
    let phones = emp.Descendants("Phone") 
    orderby (int)emp.Element("EmpId") 
    select new 
    { 
     Id = (int)emp.Element("EmpId"), 
     Name = (string)emp.Element("Name"), 
     Sex = (string)emp.Element("Sex"), 
     WorkPhone = (string)phones.FirstOrDefault(p => (string)p.Attribute("Type") == "Work"), 
     HomePhone = (string)phones.FirstOrDefault(p => (string)p.Attribute("Type") == "Home")        
    }; 

कास्टिंग का प्रयोग करें string के तत्वों, int, आदि के बजाय Value प्रॉपर्टी एक्सेस। क्यूं कर? क्योंकि अगर आपके एक्सएमएल में कुछ गायब तत्व या विशेषता है, तो आपको NullReferenceException मिल जाएगा। लेकिन कास्टिंग इसके बजाय डिफ़ॉल्ट मान वापस कर देगा। तो, उपरोक्त कोड इस तरह के xml को भी पार्स करेगा:

<Employees> 
    <Employee> 
    <EmpId>1</EmpId> 
    <Name>Sam</Name> 
    <Phone Type="Home">423-555-0124</Phone> 
    <Phone>524-777-1234</Phone> 
    </Employee> 
</Employees>