我有一个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)
失败指向根属性。
我怎样才能做到这一点?
答案 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还有许多其他有用的功能:
ExtendedXmlSerializer支持.net 4.5和.net Core。您可以将它与WebApi和AspCore集成。