【问题标题】:How to serialize property name and property value as attribute value如何将属性名称和属性值序列化为属性值
【发布时间】:2016-04-20 07:19:49
【问题描述】:

我的班级看起来像

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,但结果不是我想要的。有什么建议吗?

更新: 这是我得到的:

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

【问题讨论】:

  • 你的序列化代码在哪里?
  • 你得到的 XML 是什么?
  • 您好,感谢您的回复。已更新。

标签: c# xml xmlserializer


【解决方案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>

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      • 2014-07-21
      • 1970-01-01
      • 2011-10-02
      相关资源
      最近更新 更多