2011-12-07 13 views
8

मैंपार्स वर्ग के लिए एक्सएमएल के लिए LINQ का उपयोग कर xml वस्तुओं

<Model> 
    <Components> 
     <Component name="a" id="aaa" molarmass="60.05"/> 
     <Component name="b" id="bbb" molarmass="18.02"/> 
     <Component name="c" id="ccc" molarmass="32.04"/> 
     <Component name="d" id="ddd" molarmass="46.03"/> 
    </Components> 
    ... 
</Model> 

और वर्ग

public class ChemieComponent 
{ 
    public string Name { get; set; } 
    public string Id { get; set; } 
    public double MolarMass { get; set; } 
} 

मैं LINQ क्वेरी के साथ वस्तुओं को यह घटकों को पार्स कर सकते है? कैसे? मैं अंत में एक आईनेमरेबल होना चाहिए, है ना?

संपादित

<Points> 
    <Point name="P1" pressure="1"> 
    <Fractions> 
     <Fraction id="aaa" value="0.15272159"/> 
     <Fraction id="bbb" value="0.15272159"/> 
    </Fractions> 
    more points... 
</Points> 

उत्तर

19

आप निम्न का उपयोग कर सकते हैं:

XDocument doc = XDocument.Parse(xml); 
IEnumerable<ChemieComponent> result = from c in doc.Descendants("Component") 
             select new ChemieComponent() 
             { 
              Name = (string)c.Attribute("name"), 
              Id = (string)c.Attribute("id"), 
              MolarMass = (double)c.Attribute("molarmass") 
             }; 

संपादित

Xml के लिए Linq साथ नेस्टेड तत्वों को एक्सेस करना भी संभव है:

public class Point 
{ 
    public string Name { get; set; } 
    public int Pressure { get; set; } 

    public IEnumerable<Fraction> Fractions { get; set; } 
} 

public class Fraction 
{ 
    public string Id { get; set; } 
    public double Value { get; set; } 
} 

static void Main() 
{ 
    string xml = @"<Points> 
     <Point name='P1' pressure='1'> 
      <Fractions> 
       <Fraction id='aaa' value='0.15272159'/> 
       <Fraction id='bbb' value='0.15272159'/> 
      </Fractions> 
     </Point> 
     </Points>"; 

    XDocument doc = XDocument.Parse(xml); 
    IEnumerable<Point> result = from c in doc.Descendants("Point") 
           select new Point() 
           { 
            Name = (string)c.Attribute("name"), 
            Pressure = (int)c.Attribute("pressure"), 
            Fractions = from f in c.Descendants("Fraction") 
               select new Fraction() 
               { 
                Id = (string)f.Attribute("id"), 
                Value = (double)f.Attribute("value"), 
               } 
           }; 
} 
+0

शायद शून्य के लिए जांचना चाहें या आपका आवेदन विस्फोट हो जाएगा। –

+0

@ वाउटर: धन्यवाद! यह बहुत अच्छा काम करता है। क्या मैं सबक्वायरी बना सकता हूं? या दो प्रश्न पूछना होगा? मेरा संपादन देखें कृपया –

+0

@PedroDusso मैंने नेस्टेड चयन के लिए कुछ कोड जोड़ा है –

4

मुझे एहसास है कि यह एक पुरानी पोस्ट है, लेकिन मैं हाल ही में ऑब्जेक्ट्स में XML का कुछ पढ़ रहा हूं। मैं लिंक पर एक्सएमएल पर उत्सुक नहीं था - यह बहुत पठनीय नहीं है, "जादू तार" पर निर्भर करता है, और एक्सएमएल स्कीमा में बदलाव होने पर कोड परिवर्तन की आवश्यकता होती है।

रुचि रखने वाले किसी भी व्यक्ति के लिए, मैं XmlSerializer कक्षा का उपयोग ऑब्जेक्ट में XML को deserialize करने के लिए करता हूं। एक सामान्य सहायक विधि में अक्रमांकन कोड रखो, और देखा - कोड की एक पंक्ति का एक वस्तु ग्राफ में एक XML फ़ाइल deserialize करने के लिए: -

using System.IO; 
using System.Xml.Serialization; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var xml = @"<?xml version='1.0' encoding='utf-8' ?> 
      <Model> 
       <Points> 
        <Point name='P1' pressure='1'> 
         <Fractions> 
          <Fraction id='aaa' value='0.15272159'/> 
          <Fraction id='bbb' value='0.15272159'/> 
         </Fractions> 
        </Point> 
       </Points> 
      </Model>"; 

     var model = DeserializeObject<Model>(xml); 
    } 

    private static T DeserializeObject<T>(string xml) 
    { 
     var serializer = new XmlSerializer(typeof(T)); 
     using (var tr = new StringReader(xml)) 
     { 
      return (T)serializer.Deserialize(tr); 
     } 
    } 
} 

public class Model 
{ 
    [XmlArrayItem("Point")] 
    public Point[] Points { get; set; } 
} 

public class Point 
{ 
    [XmlAttribute(AttributeName = "name")] 
    public string Name { get; set; } 

    [XmlAttribute(AttributeName = "pressure")] 
    public int Pressure { get; set; } 

    [XmlArrayItem("Fraction")] 
    public Fraction[] Fractions { get; set; } 
} 

public class Fraction 
{ 
    [XmlAttribute(AttributeName = "id")] 
    public string Id { get; set; } 

    [XmlAttribute(AttributeName = "value")] 
    public double Value { get; set; } 
} 

चेतावनियां के एक जोड़े: -

यह समाधान स्पष्ट रूप से निर्भर करता है XML विशेषताओं वाले डोमेन मॉडल को सजाने पर, जो आपको स्वीकार्य हो सकता है या नहीं भी। समाधान एक्सएमएल में मौजूद बाहरी तत्व पर भी निर्भर करता है, और यदि रूट तत्व एक सरणी है (<Points> इस उदाहरण में) तो काम नहीं करेगा।

IEnumerable<> निर्दिष्ट करना संभव नहीं है (जिसे ओपी का उल्लेख किया गया है); आप सरणी या List<> का उपयोग कर सकते हैं।