2012-03-15 73 views
0

我有这些类:自定义.NET XML字典(键,值)序列化

Class ValueSet 
{ 
List<Value> Values { get; set; } 
} 

Class Value 
{ 
String Name { get; set;} 
String Value { get; set;} 
} 

,我想它们序列化这样的:

<Values> 
<name1>value1</name1> 
<name2>value2</name2> 
<name3>value3</name3> 
</Values> 

这可能吗? 谢谢!

+0

http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx - 试试这个 – 2012-03-15 09:34:23

+0

感谢..我编辑的问题以显示我是如何做到的。 – 2012-03-15 10:36:08

+0

“Serializer.SerializeToXMLString” - 是.NET的这一部分? – walkingTarget 2012-03-15 14:29:02

回答

0

回答我的问题..

我选择了这一点:

public class CustomXMLKeyValueList : IXmlSerializable 
{ 
    public List<CustomXMLKeyValueElement> Elements { get; set; } 

    public System.Xml.Schema.XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     //ToDo-experiment with this.. 
     throw new NotImplementedException("This document can not be deserialized."); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     foreach (var element in this.Elements) 
     { 
      element.WriteXml(writer); 
     } 
    } 
} 

public class CustomXMLKeyValueElement : IXmlSerializable 
{ 
    public string Key { get; set; } 
    public string Value { get; set; } 

    public System.Xml.Schema.XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     //ToDo-experiment with this.. 
     throw new NotImplementedException("This document can not be deserialized."); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     writer.WriteStartElement(this.Key); 
     writer.WriteString(this.Value); 
     writer.WriteEndElement(); 
    } 
} 


public class KeyValueCustomXMLSerialization_Fixture 
{ 
    public void Test() 
    { 
     var kvl = new CustomXMLKeyValueList() { Elements = new List<CustomXMLKeyValueElement>() }; 

     kvl.Elements.Add(new CustomXMLKeyValueElement() { Key = "key1", Value = "value1" }); 
     kvl.Elements.Add(new CustomXMLKeyValueElement() { Key = "key2", Value = "value2" }); 
     kvl.Elements.Add(new CustomXMLKeyValueElement() { Key = "key3", Value = "value3" }); 

     var xml = Serializer.SerializeToXMLString(kvl, true, true); 
    } 
} 

它'不是解决方案的最好的,但在它的结束,在XML VAR包含以下美丽的字符串:

<CustomXMLKeyValueList> 
    <key1>value1</key1> 
    <key2>value2</key2> 
    <key3>value3</key3> 
</CustomXMLKeyValueList> 

的“串行”是一个神奇的类,它像this,同时(因为“真,真“)ommiting命名空间和XML声明..

1

这个小方法使事情变得更加容易:

public static XmlElement SerializeElement(XmlDocument doc, String nodeName, String nodeValue) 
      { 
       XmlElement newElement = doc.CreateElement(nodeName); 

       if (nodeValue == null) 
       { 
        nodeValue = String.Empty; 
       } 

       newElement.InnerXml = nodeValue; 
       return newElement; 
      } 

然后你可以使用XmlDocument的:

public void SaveToXml(Value _Val) //Make it your collection of Value(s) instead 
{ 
    XmlDocument doc = new XmlDocument(); 

    //Create or overwrite the doc. 
    File.Create(XmlFilePath).Close(); 

    XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", null, null); 
    doc.AppendChild(dec); 

    XmlElement rootElem = Tools.SerializeElement(doc, "Root", null); //Root can be replaced with Values 

    rootElem.AppendChild(SerializeElement(doc, _Val.Name, _Val.Value); //Put this in a loop if you want more than one. 
    //Repeat the previous step to add any other properties within Root. 

    //Save XML document 
    doc.AppendChild(rootElem); 
    doc.Save(AutoLoginXmlPath); 
} 
+0

谢谢..我编辑的问题,以显示我是如何做到这一点.. – 2012-03-15 10:36:21

0
public static class Serializer 
{ 


    public static string SerializeToXMLString<T>(T obj, bool omitXmlDeclaration = false, bool omitNamespaces = false) 
     where T : class 
    { 
     return SerializeToXMLString(obj, omitXmlDeclaration, GetNamespaces(omitNamespaces)); 
    } 

    public static string SerializeToXMLString<T>(T obj, bool omitXmlDeclaration = false, params XmlSerializerNamespaces[] ns) 
     where T : class 
    { 
     var serializer = new XmlSerializer(typeof(T)); 
     var memstream = new MemoryStream(); 

     var writer = GetXmlWriter(memstream, GetXmlWriterSettings(omitXmlDeclaration)); 

     if (ns != null && ns.Length > 0) 
      serializer.Serialize(writer, obj, ns[0]); 
     else 
      serializer.Serialize(writer, obj); 

     memstream.Seek(0, SeekOrigin.Begin); 
     var sr = new StreamReader(memstream); 

     var str = sr.ReadToEnd(); 

     writer.Flush(); 
     writer.Close(); 

     sr.Dispose(); 
     memstream.Dispose(); 

     return str; 
    } 

    private static XmlWriterSettings GetXmlWriterSettings(bool omitDeclaration) 
    { 
     var settings = new XmlWriterSettings(); 
     settings.Indent = true; 
     settings.OmitXmlDeclaration = omitDeclaration; 

     return settings; 
    } 

    private static XmlSerializerNamespaces[] GetNamespaces(bool omit) 
    { 
     var nspaces = new List<XmlSerializerNamespaces>(); 

     if (omit) 
     { 
      var ns = new XmlSerializerNamespaces(); 
      ns.Add(String.Empty, String.Empty); 

      nspaces.Add(ns); 
     } 

     return nspaces.ToArray(); 
    } 
}