【问题标题】:Serialize/deserialize XML with multiple elements with same name and incrementing number using XmlSerializer使用 XmlSerializer 序列化/反序列化具有多个具有相同名称和递增编号的元素的 XML
【发布时间】:2018-04-11 12:45:52
【问题描述】:

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

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。 我也必须反过来做。

有什么方法可以实现吗?

【问题讨论】:

  • 我不认为你可以用XmlSerializer 做到这一点。但是我不明白为什么你认为你需要这个。您可以使用XmlArrayItemAttribute 对列表进行序列化。然后这将序列化为&lt;Root&gt;&lt;Element&gt;...&lt;/Element&gt;&lt;Element&gt;...&lt;/Element&gt;&lt;/Root&gt;
  • @HimBromBeere 谢谢,但这对我没有帮助,因为 XML 与 API 相关,并且必须与上面的完全一样。
  • 实现的唯一方法是实现IXmlSerializable
  • 你必须使用序列化程序还是也可以使用XDocument之类的东西?
  • @HimBromBeere 我也很害怕,但我希望有另一种方法......

标签: c# xml xmlserializer


【解决方案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();
        }

结果:

您只需添加错误验证代码即可完成。有关 LINQ to XML 的更多信息,请查看this

【讨论】:

  • 感谢您的回复。我希望有一个更通用的解决方案,因为该结构包含许多元素,例如我的示例中的元素。此外,XML 实际上要复杂得多。所以我尽量避免手动生成 XML。
猜你喜欢
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
相关资源
最近更新 更多