2012-01-27 3 views
1

У меня есть XML-файл следующим образом:конвертировать словарь в XML с помощью C#

<states> 
<state name ="Alaska"> 
    <Location Name="loc1"> 
    <Address>testadd1</Address> 
    <DateNTime>d1</DateNTime> 
    </Location> 
    <Location Name="loc2"> 
    <Address>add2</Address> 
    <DateNTime>d2</DateNTime> 
    </Location> 
</state> 
</states> 

Я преобразовал это в следующем словаре следующим образом:

 XDocument doc = XDocument.Load(Server.MapPath("test2.xml")); 

     IDictionary<string, Dictionary<string, Property>> dictionary = doc.Root.Elements("state").ToDictionary(
      s => s.Attribute("name").Value, 
      s => s.Elements("Location").ToDictionary(
       loc => loc.Attribute("Name").Value, 
       loc => new Property 
       { 
        address = loc.Element("Address").Value, 
        datetime = loc.Element("DateNTime").Value 
       })); 

класс:

public class Property 
{ 
    public string address; 
    public string datetime; 

} 

Я внес изменения в словарь, Теперь мне нужно преобразовать это обратно в XML. Может ли кто-нибудь предложить мне, как я могу это сделать?

+0

Где именно проблема? Простые предложения о том, как это сделать, похоже, идут по строкам: «Создайте XML-документ и пропустите свой словарь, добавив к нему элементы». Более сложными было бы найти сериализатор, который сделает эту работу для вас ... Я бы подумал, что просто делать это вручную довольно просто, если вы можете сделать обратное ... – Chris

+0

[This] (http: // social. msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/cc440cd8-122d-4e90-bfc1-de237c4a4760/) сообщение может заставить вас идти. – mreyeros

ответ

4

Вы можете сделать это наоборот:

var result = new XDocument(new XElement("states", 
    dictionary.Select(i => new XElement("state", new XAttribute("name", i.Key), 
     i.Value.Select(v => new XElement("Location", new XAttribute("Name", v.Key), 
      new XElement("Address", v.Value.address), 
      new XElement("DateNTime", v.Value.datetime) 
    )) 
)) 
)); 

var xml = result.ToString(); 

Это получает Вас (используя свой фрагмент данных):

<states> 
    <state name="Alaska"> 
    <Location Name="loc1"> 
     <Address>testadd1</Address> 
     <DateNTime>d1</DateNTime> 
    </Location> 
    <Location Name="loc2"> 
     <Address>add2</Address> 
     <DateNTime>d2</DateNTime> 
    </Location> 
    </state> 
</states> 
1

Если вам не требуется, используя IDictionary, я считаю, это очень легко для работы с XmlSerializer.

Модели

[XmlRoot(ElementName="states")] 
public class Container 
{ 
    [XmlElement("state")] 
    public List<State> States { get; set; } 
} 

public class State 
{ 
    [XmlAttribute()] 
    public string name { get; set; } 

    [XmlElement("Location")] 
    public List<Location> Locations { get; set; } 
} 

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

    public string Address { get; set; } 

    public DateTime DateNTime { get; set; } 
} 

Десериализация объекты XML

var xml = @"<?xml version='1.0' encoding='utf-16'?> 
        <states> 
        <state name ='Alaska'> 
         <Location Name='loc1'> 
         <Address>testadd1</Address> 
         <DateNTime>2012-01-01</DateNTime> 
         </Location> 
         <Location Name='loc2'> 
         <Address>add2</Address> 
         <DateNTime>2012-01-01</DateNTime> 
         </Location> 
        </state> 
        </states>"; 

var stream = new System.IO.StringReader(xml); 

var serializer = new System.Xml.Serialization.XmlSerializer(typeof(Container)); 

var container = serializer.Deserialize(stream); 

сериализации объектов в XML

//create and populate the container with your data here 
//probably created when you hydrate your object from XML as in above. 
var container = new Container(); 

//used to clean up unneeded namespaces 
var xmlSerializerNamespace = new System.Xml.Serialization.XmlSerializerNamespaces(); 
xmlSerializerNamespace.Add(string.Empty, string.Empty); 

var serializer = new System.Xml.Serialization.XmlSerializer(typeof(Container)); 

var stream = new System.IO.StringWriter(); 

//serialize your object to a stream 
serializer.Serialize(stream, container, xmlSerializerNamespace); 

var yourXml = stream.ToString(); 
+0

Большое спасибо за ваш ответ – Krishh

+0

без проблем! – Craig

 Смежные вопросы

  • Нет связанных вопросов^_^