2009-09-21 28 views
7

我有一个XML文档:如何在保留使用XmlSerializer的内容的同时更改根元素名称?

<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)指向根属性。

我该如何做到这一点?

回答

9

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

4

您是否尝试过使用XmlAttributeOverrides类?

+1

你一定要喜欢你在框架中通过浏览本网站找到的所有这些好东西。 – 2009-09-21 20:52:00

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

感谢马修,但我的挑战是反序列化 dataNew对象。因此,在您的代码中,XML文件将是相同的,但序列化逻辑需要执行如下所示的操作: var xSer2 = new XmlSerializer(typeof(dataNew)); var obj2 = xSer2.Deserialize(fs1); – G33kKahuna 2009-09-23 21:38:46

+0

Mathew,任何想法...谢谢 – G33kKahuna 2009-09-26 05:05:05

+0

在这种情况下,您将用“data”替换XmlRootAttribute(“dataNew”),typeof(data)将是typeof(dataNew) – 2009-09-26 06:45:32

7

如果只有你想改变,你可以声明XmlSerializer的时候指定根属性的根名称。

XmlSerializer xmlSerializer = new XmlSerializer(typeof(data), new XmlRootAttribute("dataNew")); 
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有许多其他有用的功能:

  • 反序列化ñXML从标准的XMLSerializer
  • 序列化类属性界面
  • 系列化循环引用和参考编号
  • 反序列化的旧版本的XML
  • 物业加密
  • 自定义序列

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

相关问题