2010-02-24 20 views
5

एक्सएमएल नमूना (original link) एक्सएमएल के लिए LINQ के माध्यम से एक्सएमएल से मिलता है:कैसे मैं सभी "properties"

<records> 
    <record index="1"> 
    <property name="Username">Sven</property> 
    <property name="Domain">infinity2</property> 
    <property name="LastLogon">12/15/2009</property> 
    </record> 
    <record index="2"> 
    <property name="Username">Josephine</property> 
    <property name="Domain">infinity3</property> 
    <property name="LastLogon">01/02/2010</property> 
    </record> 
    <record index="3"> 
    <property name="Username">Frankie</property> 
    <property name="Domain">wk-infinity9</property> 
    <property name="LastLogon">10/02/2009</property> 
    </record> 
</records> 

मैं एक्सएमएल में रिकॉर्ड प्रति एक वर्ग का एक उदाहरण प्राप्त करने के लिए इच्छुक हूँ।

मुझे यहां समान उदाहरण मिलते हैं लेकिन उनके पास केवल रूट था, फिर एक तत्व गहरा था। यह काम करता है, सही तक मैं में है कि अन्य तत्व डाल मैं की तरह

foreach(Record rec in myVar) 
{ 
Console.WriteLine("ID: {0} User:{1} Domain:{2} LastLogon:{3}",rec.Index, rec.Username, rec.Domain, rec.LastLogon); 
} 

उत्तर

3

संपादित कुछ करने के लिए सक्षम होना चाहते हैं:। स्पष्टता और दक्षता के लिए ToDictionary दृष्टिकोण के साथ अद्यतन कोड।

आप निम्न नमूना आज़मा सकते हैं। यदि आप select new Record लाइन से Record हटाते हैं तो इसका परिणाम अज्ञात प्रकार होगा और अभी भी काम करेगा। यदि आपने अन्य रचनाकार प्रदान किए हैं तो आपके Record वर्ग में ऑब्जेक्ट प्रारंभकर्ता का उपयोग करने के लिए एक डिफ़ॉल्ट पैरामीटर रहित कन्स्ट्रक्टर होना चाहिए (यदि आपके पास कोई कन्स्ट्रक्टर नहीं है तो यह भी काम करेगा)। अन्यथा आप ऑब्जेक्ट प्रारंभकर्ता के बजाय उपलब्ध कन्स्ट्रक्टर का उपयोग कर सकते हैं।

ध्यान दें कि Single() और Value का उपयोग मान लें कि एक्सएमएल किसी भी गायब तत्वों के बिना अच्छी तरह से गठित है।

var xml = XElement.Parse(@"<records> 
<record index=""1""> 
    <property name=""Username"">Sven</property> 
    <property name=""Domain"">infinity2</property> 
    <property name=""LastLogon"">12/15/2009</property> 
</record> 
<record index=""2""> 
    <property name=""Username"">Josephine</property> 
    <property name=""Domain"">infinity3</property> 
    <property name=""LastLogon"">01/02/2010</property> 
</record> 
<record index=""3""> 
    <property name=""Username"">Frankie</property> 
    <property name=""Domain"">wk-infinity9</property> 
    <property name=""LastLogon"">10/02/2009</property> 
</record> 
</records>"); 

var query = from record in xml.Elements("record") 
     let properties = record.Elements("property") 
           .ToDictionary(p => p.Attribute("name").Value, p => p.Value) 
     select new Record 
     { 
      Index = record.Attribute("index").Value, 
      Username = properties["Username"], 
      Domain = properties["Domain"], 
      LastLogon = properties["LastLogon"] 
     }; 

foreach(var rec in query) 
{ 
    Console.WriteLine("ID: {0} User:{1} Domain:{2} LastLogon:{3}", rec.Index, rec.Username, rec.Domain, rec.LastLogon); 
} 

संपादित करें: मैं ToDictionary दृष्टिकोण है जो स्वच्छ और तेज है के साथ ऊपर कोड नमूना नवीनीकृत किया है। मेरे बेंचमार्किंग प्रयासों के आधार पर सबसे तेज़ ToDictionary था, इसके बाद Func और फिर Where दृष्टिकोण था। समारोह

साथ

मूल प्रश्न

var query = from record in xml.Elements("record") 
      let properties = record.Elements("property") 
      select new Record 
      { 
       Index = record.Attribute("index").Value, 
       Username = properties.Where(p => p.Attribute("name").Value == "Username").Single().Value, 
       Domain = properties.Where(p => p.Attribute("name").Value == "Domain").Single().Value, 
       LastLogon = properties.Where(p => p.Attribute("name").Value == "LastLogon").Single().Value 
      }; 

क्वेरी मूल प्रश्न के

अतिरिक्तता निम्नलिखित कोड का उपयोग करके कम किया जा सकता:

Func<XElement, string, string> GetAttribute = 
      (e, property) => e.Elements("property") 
          .Where(p => p.Attribute("name").Value == property) 
          .Single().Value; 

var query = from record in xml.Elements("record") 
      select new Record 
      { 
       Index = record.Attribute("index").Value, 
       Username = GetAttribute(record, "Username"), 
       Domain = GetAttribute(record, "Domain"), 
       LastLogon = GetAttribute(record, "LastLogon") 
      }; 
+0

PERFICT! मैं इसे 2-3 दिनों के लिए समझने की कोशिश कर रहा हूं। मेरा माथा दुखद और लाल है। LINQ (और C#) को विनियमित करने के लिए आप कौन सी पुस्तकें पुनः अनुशंसा करते हैं। –

+0

@ सुन्ज़ारू मुझे LINQ इन एक्शन (http://www.amazon.com/dp/1933988169/) पसंद है या आप कुछ नई सामग्री को कवर करने के लिए सी # 4.0/.NET 4.0 पुस्तक प्राप्त करना चाह सकते हैं। संक्षेप में सी # 4.0 अच्छा है लेकिन इसमें बहुत सारी सामग्री शामिल है। मैं LINQPad (http://www.linqpad.net/) डाउनलोड करने और इसके साथ आने वाले संक्षिप्त नमूने के माध्यम से जाने की भी सिफारिश करता हूं (पुस्तक के लेखक द्वारा बनाई गई)। आप इसके माध्यम से एक्शन नमूने में LINQ भी डाउनलोड कर सकते हैं। शायद किताब खरीदने से पहले ऐसा करें :) –

+0

मैंने आज परीक्षण किया कि 120MS का औसत प्रक्रिया समय था। लेकिन उन 120MS में मैं ऊपर वर्णित कुछ अन्य संकेतकों की भी तलाश कर रहा था। तेजी से .. slick और zomg .. sooo "संपादित करें-> खोजें" से बहुत बेहतर है। एक बार फिर धन्यवाद! –

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