使用XmlSerializer使用具有相同名称和递增编号的多个元素序列化/反序列化XML

时间:2018-04-11 12:45:52

标签: c# xml xmlserializer

我需要序列化与此相关的类:

public class Root {
    public string[] Elements {get;set;}
}

到这样的XML:

<?xml version="1.0" encoding="utf-8"?>
<Root>
    <Element_01>1st element</Element_01>
    <Element_02>2nd element</Element_02>
    <Element_03>3rd element</Element_03>
    <Element_04>4th element</Element_04>
</Root>

当对象被实例化时:

var root = new Root {
    Elements = new[] {
        "1st element", "2nd element", "3rd element"
        "4th element"
    }
};

使用System.Xml.Serialization.XmlSerializer。 我也必须反过来这样做。

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:1)

您可能想要探索使用XLinq的替代方法,对于您的特定方案,它会更简单,更容易,看看您的Root类可能会被重写:

public class Root
{
    public string[] Elements { get; set; }

    public string GetXmlString()
    {
        var rootElement = new XElement("Root");
        for (var i = 0; i < Elements.Length; i++)
        {
            var tag = $"Element_{(i + 1).ToString().PadLeft(2, '0')}";
            var xElement = new XElement(tag, Elements[i]);
            rootElement.Add(xElement);
        }

        return rootElement.ToString();
    }

    public static Root DeserializeXmlString(string xmlString)
    {
        var rootElement = XElement.Parse(xmlString);
        var elementsArray = rootElement
            .Elements()
            .Select(xElement => xElement.Value)
            .ToArray();

        return new Root {Elements = elementsArray};
    }
}

并测试:

private static void Main()
        {
            var root = new Root
            {
                Elements = new[]
                {
                    "1st element", "2nd element", "3rd element", "4th element"
                }
            };
            var xmlString = root.GetXmlString();
            Console.WriteLine(xmlString);

            var deserializedRoot = Root.DeserializeXmlString(xmlString);
            foreach (var element in deserializedRoot.Elements)
                Console.WriteLine(element);

            Console.ReadLine();
        }

结果: enter image description here

您只需要添加错误验证代码即可完成。有关LINQ to XML检查this

的更多信息