2016-04-20 175 views
0

我的类看起来像如何序列化属性名称和属性值的属性值

public class Test 
{ 
    private string name;   
    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 

    private int age;   
    public int Age 
    { 
     get { return age; } 
     set { age = value; } 
    }   
} 

我想XML结果,如:

<NodeList> 
<Node> 
    <DataNode Key="Name" Value="Tom" /> 
    <DataNode Key="Age" Value="30" /> 
</Node> 
<Node> 
    <DataNode Key="Name" Value="John" /> 
    <DataNode Key="Age" Value="35" /> 
</Node> 
</NodeList> 

我已经尝试设置XmlAttribute的财产,但结果不是我想要的。有什么建议么?

更新: 这是我得到:

<?xml version="1.0" encoding="utf-16"?><Node xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="Allen" Age="28" />

+1

你的代码在哪里做序列化? – auburg

+0

你得到的是什么XML? –

+0

你好,谢谢你的回复。更新。 – Allen4Tech

回答

1

我建议你使用太多直接的方法,为您的数据是这样的:

[Serializable()] 
public class NodeList { 
    [XmlArray("Node")] 
    [XmlArrayItem("DataNode")] 
    public Test[] Nodes; 
} 

public class Test { 
    [XmlAttribute] 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

并使用它像这样:

string folderpath = Application.StartupPath + "\\settings"; 
string appSettingsFilename = "testsettings2"; 
if (!Directory.Exists(folderpath)) 
    Directory.CreateDirectory(folderpath); 
string filepath = folderpath + "\\" + appSettingsFilename + ".xml"; 

NodeList nodes = new NodeList(); 
XmlSerializer serializer = new XmlSerializer(typeof(NodeList)); 
TextWriter configWriteFileStream = new StreamWriter(filepath); 

nodes.Nodes = new Test[2] { 
    new Test() { Name = "Tom", Age=30}, 
    new Test() { Name = "John", Age=35} 
}; 

serializer.Serialize(configWriteFileStream, nodes); 
configWriteFileStream.Close(); 

;你要得到:

<?xml version="1.0" encoding="utf-8"?> 
<NodeList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Node> 
    <DataNode Name="Tom" Age="30" /> 
    <DataNode Name="John" Age="35" /> 
    </Node> 
</NodeList> 

话虽这么说,让XML文件,只要你想,你实际上应该声明你的类像这样(注释):

[Serializable()] 
public class DummyClass2 { 
    [XmlElement("NodeList")] //necessary to indicate that this is an element, otherwise will be considered as array 
    public TestList[] NodeList = null; 
} 

public class TestList { 
    [XmlArray("Node")] //let this be array 
    [XmlArrayItem("DataNode")] 
    public Test[] TestItem { get; set; } 
} 

public class Test { 
    private string key; 
    [XmlAttribute("Key")] 
    public string Key { //declare as Key instead 
     get { return key; } 
     set { key = value; } 
    } 

    private string value2; //cannot be int, must be string to accommodate both "Tom" and "30" 
    [XmlAttribute("Value")] 
    public string Value { //declare as Value instead 
     get { return value2; } 
     set { value2 = value; } 
    } 
} 

你可以这样使用它:

string folderpath = Application.StartupPath + "\\settings"; 
string appSettingsFilename = "testsettings"; 
if (!Directory.Exists(folderpath)) 
    Directory.CreateDirectory(folderpath); 
string filepath = folderpath + "\\" + appSettingsFilename + ".xml"; 

DummyClass2 dummyClass2 = new DummyClass2(); 
XmlSerializer serializer = new XmlSerializer(typeof(DummyClass2)); 
TextWriter configWriteFileStream = new StreamWriter(filepath); 

dummyClass2.NodeList = new TestList[2] { 
    new TestList() { 
     TestItem = new Test[2] { 
      new Test() { Key="Name", Value="Tom"}, 
      new Test() { Key="Age", Value="30"} 
     } 
    }, 
    new TestList() { 
     TestItem = new Test[2] { 
      new Test() { Key="Name", Value="John"}, 
      new Test() { Key="Age", Value="35"} 
     } 
    } 
}; 

serializer.Serialize(configWriteFileStream, dummyClass2); 
configWriteFileStream.Close(); 

你应该得到:

<?xml version="1.0" encoding="utf-8"?> 
<DummyClass2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <NodeList> 
    <Node> 
     <DataNode Key="Name" Value="Tom" /> 
     <DataNode Key="Age" Value="30" /> 
    </Node> 
    </NodeList> 
    <NodeList> 
    <Node> 
     <DataNode Key="Name" Value="John" /> 
     <DataNode Key="Age" Value="35" /> 
    </Node> 
    </NodeList> 
</DummyClass2> 
0

你不需要序列化。试试这个

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 



namespace ConsoleApplication85 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var inputs = new[] { 
       new { name = "Tom", age = 30}, 
       new { name = "John", age = 35} 
          }; 


      XElement nodeList = new XElement("NodeList"); 
      XElement node = new XElement("Node"); 
      nodeList.Add(node); 

      foreach (var input in inputs) 
      { 
       node.Add(new XElement("DataNode", new XAttribute[] { new XAttribute("Key", input.name), new XAttribute("Value", input.age)})); 
      } 
     } 

    } 

}