工作中遇到接口对接需求:
<?xml version="1.0"?>
<Student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Id>1</Id>
<Name />
<Age>26</Age>
</Student>
需要将上面的XML文本Name标签,转换成下图格式
<?xml version="1.0" encoding="utf-16"?>
<Student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Id>1</Id>
<Name></Name>
<Age>26</Age>
</Student>
c# xml序列化默认会将空字符串标签,序列化成单标签闭合
如何实现?
重写XmlTextWriter类:
public class FullXmlTextWriter : XmlTextWriter
{
public FullXmlTextWriter(TextWriter sink)
: base(sink) { }
public FullXmlTextWriter(Stream stream, Encoding enc) : base(stream, enc) { }
public FullXmlTextWriter(string str, Encoding enc) : base(str, enc) { }
public override void WriteEndElement()
{
base.WriteFullEndElement();
}
}
新的序列化方法:
public static string FullXmlSerialize<T>(T entity)
{
MemoryStream stream = new MemoryStream();
XmlSerializer serializer = new XmlSerializer(entity.GetType());
FullXmlTextWriter writer = new FullXmlTextWriter(stream, Encoding.Unicode);
writer.Formatting = Formatting.Indented;//XML格式化,xml序列化实现双标签闭合
serializer.Serialize(writer, entity);
StreamReader reader = new StreamReader(stream, Encoding.Unicode);
stream.Position = 0;
string xml = reader.ReadToEnd();
stream.Dispose();
writer.Dispose();
reader.Dispose();
return xml;
}
添加实体:Student
[Serializable]
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
完整代码 program:
static void Main(string[] args)
{
Student stu = new Student
{
Age = 26,
Name = "",
Id = 1
};
string xmlStr = XmlSerializer(stu);
string xmlFullStr = FullXmlSerialize(stu);
Console.WriteLine("默认XML:");
Console.WriteLine(xmlStr);
Console.WriteLine("完整XML:");
Console.WriteLine(xmlFullStr);
Console.ReadKey();
}
public static string XmlSerializer<T>(T entity)
{
MemoryStream Stream = new MemoryStream();
XmlSerializer xml = new XmlSerializer(typeof(T));
//序列化对象
xml.Serialize(Stream, entity);
Stream.Position = 0;
StreamReader sr = new StreamReader(Stream);
string str = sr.ReadToEnd();
sr.Dispose();
Stream.Dispose();
return str;
}
public static string FullXmlSerialize<T>(T entity)
{
MemoryStream stream = new MemoryStream();
XmlSerializer serializer = new XmlSerializer(entity.GetType());
FullXmlTextWriter writer = new FullXmlTextWriter(stream, Encoding.Unicode);
writer.Formatting = Formatting.Indented;//XML格式化,xml序列化实现双标签闭合
serializer.Serialize(writer, entity);
StreamReader reader = new StreamReader(stream, Encoding.Unicode);
stream.Position = 0;
string xml = reader.ReadToEnd();
stream.Dispose();
writer.Dispose();
reader.Dispose();
return xml;
}
public static object XmlDeserialize<T>(Stream stream)
{
XmlSerializer xmldes = new XmlSerializer(typeof(T));
return xmldes.Deserialize(stream);
}
public static object XmlDeserialize<T>(string xmlStr)
{
using (StringReader sr = new StringReader(xmlStr))
{
XmlSerializer xs = new XmlSerializer(typeof(T));
return xs.Deserialize(sr);
}
}
输出: