c# - 在 .NET 中将 List<object> 序列化为 XML 时如何重命名根节点?

标签 c# .net xml serialization attributes

我正在将美国各州列表序列化为 XML,虽然我可以使用属性控制大多数输出​​元素的名称,但根节点始终称为“ArrayOfStates”。有没有办法改变它,使其只是“状态”?

代码:

    public class Program
    {
        [XmlArray("States")]
        public static List<State> States;

        public static void Main(string[] args)
        {
            PopulateListOfStates();

            var xml = new XmlSerializer(typeof(List<State>));
            xml.Serialize(new XmlTextWriter(@"C:\output.xml",Encoding.Default), States);
        }
    }

    public struct State
    {
        [XmlAttribute]
        public string Name;

        [XmlArray("Neighbours")]
        [XmlArrayItem("Neighbour")]
        public List<string> Neighbours;
    }

输出:

<?xml version="1.0" encoding="Windows-1252"?>
<ArrayOfState xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <State Name="AL">
        <Neighbours>
            <Neighbour>FL</Neighbour>
            <Neighbour>GA</Neighbour>
            <Neighbour>MS</Neighbour>
            <Neighbour>TN</Neighbour>
        </Neighbours>
    </State>
    <State Name="FL">
        <Neighbours>
            <Neighbour>AL</Neighbour>
            <Neighbour>GA</Neighbour>
        </Neighbours>
    </State>
    <State Name="GA">
        <Neighbours>
            <Neighbour>AL</Neighbour>
            <Neighbour>FL</Neighbour>
            <Neighbour>NC</Neighbour>
            <Neighbour>SC</Neighbour>
            <Neighbour>TN</Neighbour>
        </Neighbours>
    </State>
    ...
</ArrayOfState>

顺便说一句,是否也可以将“Neighbour”元素的内容作为这些元素的属性(即 <Neighbour name="XX"/> )?

最佳答案

[Serializable]
public class Worksheet
{
    [XmlRoot(ElementName = "XML")]
    public class XML
    {
        [XmlArray("States")]
        public List<State> States { get; set; }
    }

    public class State
    {
        [XmlAttribute]
        public string Name { get; set; }

        [XmlArray("Neighbours")]
        [XmlArrayItem("Neighbour")]
        public List<Neighbour> Neighbours { get; set; }
    }

    public class Neighbour
    {
        [XmlAttribute]
        public string Name { get; set; }
    }
}

public static void Main(string[] args)
{
    Worksheet.XML xml = PopulateListOfStates();

    XmlSerializer serializer = new XmlSerializer(typeof(Worksheet.XML));
    using (StreamWriter writer = new StreamWriter(@"C:\output.xml", false))
    {
        serializer.Serialize(writer, xml);
    }
}

关于c# - 在 .NET 中将 List<object> 序列化为 XML 时如何重命名根节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40412747/

相关文章:

c# - 计算给定 X Y 系列的局部最大值/最小值

c# - 为什么我的 CurrentCulture en-GB 而我的 CurrentUICulture en-US

c# - 简单注入(inject)器:跨相同图的服务注入(inject)相同的UnitOfWork实例

c# - 如何使用 LINQ 将一个值与其先前的值进行比较?

c# - 使用 ViewModels 通过按钮将文本框绑定(bind)到文本 block

html - 如何在原生脚本中设计带框阴影的按钮

java - XmlSerializer 会不会返回一个太长的 String 而不是 Java 中的字符串?

c# - 使用转换器将窗口标题绑定(bind)到属性

python - 如何使用 Python 删除部分 XML 数据并将其写入新文件

c# - 在属性窗口中更改时自定义属性不会保存