简体   繁体   English

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

[英]Serialize/deserialize XML with multiple elements with same name and incrementing number using XmlSerializer

I need to serialize an class related to this: 我需要序列化与此相关的类:

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

to an XML like this: 到这样的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>

when the object is instantiated like so: 实例化对象时,如下所示:

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

using the System.Xml.Serialization.XmlSerializer . 使用System.Xml.Serialization.XmlSerializer I have to do it the other way round, too. 我也必须反过来做。

Is there any way to achieve this? 有什么办法可以做到这一点?

You may want to explore an alternative way using XLinq, for your particular scenario it would be simpler and easier, take a look to how your Root class may be rewritten: 您可能想探索使用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};
    }
}

And testing: 并测试:

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

Result: 结果: 在此处输入图片说明

You have only to add error validation code and you are pretty much done. 您只需要添加错误验证代码,就可以完成很多工作。 For more info on LINQ to XML check this 有关LINQ to XML的更多信息,请检查

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

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