2013-02-16 37 views
6

मेरे पास एक XMLDocument है जिसे मुझे ऑब्जेक्ट्स के एक सेट में पढ़ने और बदलने की आवश्यकता है। मैं निम्नलिखित वस्तुओंइस XML दस्तावेज़ को मेरी ऑब्जेक्ट में कनवर्ट करने का सबसे आसान तरीका क्या है?

public class Location 
{ 
     public string Name; 
     public List<Building> Buildings; 
} 

public class Building 
{ 
    public string Name; 
    public List<Room> Rooms; 
} 

है और मैं निम्नलिखित एक्सएमएल फ़ाइल है:

<?xml version="1.0" encoding="utf-8" ?> 
<info> 
<locations> 
    <location name="New York"> 
    <Building name="Building1"> 
    <Rooms> 
     <Room name="Room1"> 
     <Capacity>18</Capacity> 
     </Room> 
     <Room name="Room2"> 
     <Capacity>6</Capacity> 
     </Room> 
    </Rooms> 
    </Building> 

    <Building name="Building2"> 
    <Rooms> 
     <Room name="RoomA"> 
     <Capacity>18</Capacity> 
     </Room> 
    </Rooms> 
    </Building> 
</location> 
<location name ="London"> 
    <Building name="Building45"> 
    <Rooms> 
     <Room name="Room5"> 
     <Capacity>6</Capacity> 
     </Room> 
    </Building> 
</location> 
</locations> 
</info> 

ऐसा करने का सबसे अच्छा तरीका क्या है? क्या मुझे xmldocument को स्वचालित रूप से ऑब्जेक्ट में क्रमबद्ध करना चाहिए या क्या मुझे प्रत्येक तत्व को पार्स करने और मैन्युअल रूप से मेरे ऑब्जेक्ट में कनवर्ट करने की आवश्यकता है? विशेष रूप से, मैं यह पता लगाने की कोशिश कर रहा हूं कि संग्रह (स्थानों, भवनों, आदि) को कैसे परिवर्तित किया जाए।

सबसे अच्छा सुझाव मूल रूप से एक

List<Location> 

वस्तुओं में इस एक्सएमएल फ़ाइल कन्वर्ट करने के लिए क्या है?

उत्तर

11

आप अपने एक्सएमएल फिक्सिंग से शुरू कर सकता है क्योंकि उदाहरण में आप से पता चला है कि आप खुली हुई टैग नहीं है। भवनों के अलावा अन्य स्थान गुणों में अन्य गुण रखने में सक्षम होने के लिए आप <Building> टैग को <Buildings> संग्रह में भी लपेट सकते हैं।

<?xml version="1.0" encoding="utf-8" ?> 
<info> 
    <locations> 
    <location name="New York"> 
     <Buildings> 
     <Building name="Building1"> 
      <Rooms> 
      <Room name="Room1"> 
       <Capacity>18</Capacity> 
      </Room> 
      <Room name="Room2"> 
       <Capacity>6</Capacity> 
      </Room> 
      </Rooms> 
     </Building> 

     <Building name="Building2"> 
      <Rooms> 
      <Room name="RoomA"> 
       <Capacity>18</Capacity> 
      </Room> 
      </Rooms> 
     </Building> 
     </Buildings> 
    </location> 
    <location name="London"> 
     <Buildings> 
     <Building name="Building45"> 
      <Rooms> 
      <Room name="Room5"> 
       <Capacity>6</Capacity> 
      </Room> 
      </Rooms> 
     </Building> 
     </Buildings> 
    </location> 
    </locations> 
</info> 

एक बार जब आप अपना एक्सएमएल तय कर लेंगे तो आप अपने मॉडल को अनुकूलित कर सकते हैं। मैं अपनी कक्षाओं में खेतों के बजाय गुण का उपयोग कर आप की सिफारिश करेंगे:

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

    public List<Building> Buildings { get; set; } 
} 

public class Building 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 
    public List<Room> Rooms { get; set; } 
} 

public class Room 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 
    public int Capacity { get; set; } 
} 

[XmlRoot("info")] 
public class Info 
{ 
    [XmlArray("locations")] 
    [XmlArrayItem("location")] 
    public List<Location> Locations { get; set; } 
} 

और अब सब अब सिर्फ़ है deserialize एक्सएमएल:

var serializer = new XmlSerializer(typeof(Info)); 
using (var reader = XmlReader.Create("locations.xml")) 
{ 
    Info info = (Info)serializer.Deserialize(reader); 
    List<Location> locations = info.Locations; 
    // do whatever you wanted to do with those locations 
} 
6

बस उदाहरण के लिए एक्सएमएल क्रमबद्धता attributes- का उपयोग करें: - सब कुछ डिफ़ॉल्ट रूप से एक्सएमएल तत्वों के रूप में श्रृंखलाबद्ध किया जाएगा -

public class Location 
{ 
     [XmlAttribute("name"); 
     public string Name; 
     public List<Building> Buildings; 
} 

public class Building 
{ 
    [XmlAttribute("name"); 
    public string Name; 
    public List<Room> Rooms; 
} 

बस इतना ध्यान रखें sames वस्तुओं के नाम :)

रूप में एक ही साथ

लोड करने के लिए यह करें:

using(var stream = File.OpenRead("somefile.xml")) 
{ 
    var serializer = new XmlSerializer(typeof(List<Location>)); 
    var locations = (List<Location>)serializer.Deserialize(stream); 
}