如何使用XmlSerializer更改根元素名称并保留内容?

14

我有一个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。 它一直失败,并指向根属性的错误文档(1,2)

我该如何实现这个?

6个回答

24
如果您只想更改根名称,可以在声明XmlSerializer时指定根属性。
XmlSerializer xmlSerializer = new XmlSerializer(typeof(data), new XmlRootAttribute("dataNew"));

15

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


6

1
你一定会喜欢在这个网站上冲浪时发现的框架中的所有好东西。 - Matthew Whited

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

谢谢Mathew,但我的挑战是将<data>反序列化为dataNew对象。因此,在您的代码中,XML文件将保持不变,但序列化逻辑需要执行类似以下的操作var xSer2 = new XmlSerializer(typeof(dataNew));
var obj2 = xSer2.Deserialize(fs1);
- G33kKahuna
在这种情况下,您将使用"data"替换XmlRootAttribute(“dataNew”),并且data的typeof(dataNew)将是typeof(data)。 - Matthew Whited

1
您可以使用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
  • 具有属性接口的序列化类
  • 序列化循环引用和引用Id
  • 反序列化旧版本的xml
  • 属性加密
  • 自定义序列化器
ExtendedXmlSerializer支持.net 4.5和.net Core。您可以将其与WebApi和AspCore集成。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接