如何在使用XmlSerializer保留内容的同时更改根元素名称?

时间:2009-09-21 20:19:53

标签: c# .net xml xml-serialization

我有一个XML文档:

<data>
    <elmt1>Element 1</elmt1>
    <elmnt2>Element 2</elmnt2>
    <elmnt3>Element 3</elmnt3>
</data>

我需要反序列化为一个序列化为不同根名称的对象,其他所有内容保持不变。

例如:

<dataNew>
    <elmt1>Element 1</elmt1>
    <elmnt2>Element 2</elmnt2>
    <elmnt3>Element 3</elmnt3>
</dataNew>

序列化时,我们始终可以应用XmlRootAttribute序列化到不同的根名称,但我不确定如何反序列化为其他XmlRootAttribute。它使error in document (1,2)失败指向根属性。

我怎样才能做到这一点?

6 个答案:

答案 0 :(得分:12)

如果它只是您想要更改的根名称,则可以在声明XmlSerializer时指定root属性。

XmlSerializer xmlSerializer = new XmlSerializer(typeof(data), new XmlRootAttribute("dataNew"));

答案 1 :(得分:11)

XmlRootAttribute应该可以工作

[XmlRoot("dataNew")]
public class MyData()
{
    [XmlElement("elmt1")]
    public string myElement1{get;set;}

    [XmlElement("elmnt2")]
    public string myElement2{get;set;}

    [XmlElement("elmtn3")]
    public string myElement3{get;set;}

}

编辑:完成XML

答案 2 :(得分:5)

您是否尝试使用XmlAttributeOverrides课程?

答案 3 :(得分:4)

使用XmlAttributeOverrides的示例。如果你投票,还要给hjb417一个

class Program
{
    static void Main(string[] args)
    {
        using (var fs = File.OpenRead("XmlFile1.xml"))
        using (var fs2 = File.OpenRead("XmlFile2.xml"))
        {
            var xSer = new XmlSerializer(typeof(data));
            var obj = xSer.Deserialize(fs);
        //
            var xattribs = new XmlAttributes();
            var xroot = new XmlRootAttribute("dataNew");
            xattribs.XmlRoot = xroot;
            var xoverrides = new XmlAttributeOverrides();
            xoverrides.Add(typeof(data), xattribs);
            var xSer2 = new XmlSerializer(typeof(data), xoverrides);
            var obj2 = xSer2.Deserialize(fs2);
        }
    }
}

public class data
{
    public string elmt1 { get; set; }
    public string elmnt2 { get; set; }
    public string elmnt3 { get; set; }
}

答案 4 :(得分:0)

您可能必须实施ISerializable并更改GetObjectData()中的根元素。

答案 5 :(得分:0)

您可以使用ExtendedXmlSerializer。此序列化程序支持更改根元素名称和属性名称。 如果您有这样的课程:

[XmlRoot("dataNew")]
public class Data
{
    [XmlElement("elmt1")]
    public string Element1 { get; set; }

    [XmlElement("elmnt2")]
    public string Element2 { get; set; }

    [XmlElement("elmtn3")]
    public string Element3 { get; set; }
}

您可以将其序列化:

ExtendedXmlSerializer serializer = new ExtendedXmlSerializer();
var obj = new Data
    {
        Element1 = "A",
        Element2 = "B",
        Element3 = "C",
    };
var xml = serializer.Serialize(obj);

您的xml将如下所示:

<?xml version="1.0" encoding="utf-8"?>
<dataNew type="Models.Example">
    <elmt1>A</elmt1>
    <elmnt2>B</elmnt2>
    <elmtn3>C</elmtn3>
</dataNew>

ExtendedXmlSerializer还有许多其他有用的功能:

  • 来自标准XMLSerializer的反序列化xml
  • 带有属性接口的序列化类
  • 序列化循环引用和参考标识
  • 旧版xml的反序列化
  • 属性加密
  • 自定义序列化程序

ExtendedXmlSerializer支持.net 4.5和.net Core。您可以将它与WebApi和AspCore集成。