简体   繁体   English

如何将属性名称和属性值序列化为属性值

[英]How to serialize property name and property value as attribute value

My class looks like 我的课看起来像

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; }
    }        
}

I want the xml result like: 我想要的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>

I have tried to set XmlAttribute in the property, but the result is not what I want. 我试图在属性中设置XmlAttribute,但是结果不是我想要的。 Any suggestions? 有什么建议么?

Update: This is what I get: 更新:这就是我得到的:

 <?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" /> 

I recommend you to use much straightforward approach for your data like this: 我建议您使用非常简单的方法来处理数据,如下所示:

[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; }
}

And use it like this: 并像这样使用它:

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();

And you shall get: 您将得到:

<?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>

That being said, to get XML file as you want, you should actually declare your classes like this (commented): 话虽如此,要获取所需的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; }
    }
}

And you use it like this: 您可以像这样使用它:

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();

And you should get: 您应该得到:

<?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>

You don't need serialize. 您不需要序列化。 Try this 尝试这个

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)}));
            }
        }

    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM