使用IXmlSerializable自定义xml输出
本文关键字:输出 xml 自定义 IXmlSerializable 使用 | 更新日期: 2023-09-27 18:22:47
我试图实现的目标似乎相当简单。
给定类别
public class Wrapper<T> {
T Data { get; set; }
bool Success { get;set; }
List<Error> Errors { get; set; }
}
我只想将Data参数的XML输出封装在<Data></Data>
标记中。
即:期望输出:
<Wrapper>
<Data>
<Person first="Bob" last="Robertson"/>
</Data>
<Errors/>
<Success>true</Success>
</Wrapper
实际输出:
<Wrapper>
<Person first="Bob" last="Robertson"/>
<Errors/>
<Success>true</Success>
</Wrapper>
有没有一个简单的IXmlSerializable实现,我可以在大多数情况下不进行序列化,只包装一个成员?
编辑:这是在WCF服务中,所以我(据我所知)无权访问XmlSerializer的创建。
我最终做了什么:
public void WriteXml(System.Xml.XmlWriter writer)
{
writer.WriteElementString("Success", Success.ToString());
writer.WriteStartElement("Errors");
foreach (var error in Errors)
{
Util.XmlSerialize(error, writer);
}
writer.WriteStartElement("Data");
Util.XmlSerialize(this.Data, writer);
writer.WriteEndElement();
}
-
public class Util
{
public static void XmlSerialize<T>(T obj, XmlWriter writer)
{
var nsSerializer = new XmlSerializerNamespaces();
nsSerializer.Add("", "");
var ser = new XmlSerializer(typeof (T));
ser.Serialize(writer, obj, nsSerializer);
}
}
您可以使用XmlOverrides:
var xmlOverrides = new XmlAttributeOverrides();
var attributes = new XmlAttributes();
attributes.XmlElements
.Add(new XmlElementAttribute("Person", typeof (Person)));
xmlOverrides.Add(typeof(Wrapper<Person>), "Data", attributes);
var serializer = new XmlSerializer(typeof(Wrapper<ExampleObject>), xmlOverrides);
架构
public class Wrapper<T>
{
public T Data { get; set; }
public bool Success { get; set; }
}
public class Person
{
public string first;
public string last;
}
XML序列化
Wrapper<Person> f = new Wrapper<Person>();
f.Data = new Person();
f.Data.first = "Bob";
f.Data.last = "Robertson";
XmlSerializer SerializerObj = new XmlSerializer(typeof(Wrapper<Person>));
TextWriter WriteFileStream = new StreamWriter(@"C:'test.xml");
SerializerObj.Serialize(WriteFileStream, f);
WriteFileStream.Close();
XML输出
<?xml version="1.0" encoding="utf-8"?>
<WrapperOfPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Data>
<first>Bob</first>
<last>Robertson</last>
</Data>
<Success>false</Success>
</WrapperOfPerson>