C# 格式化xml输出
我使用此方法将对象转换为XML:C# 格式化xml输出,c#,.net,xml,serialization,xml-serialization,C#,.net,Xml,Serialization,Xml Serialization,我使用此方法将对象转换为XML: protected XmlDocument SerializeAnObject(object obj) { XmlDocument doc = new XmlDocument(); DataContractSerializer serializer = new DataContractSerializer(obj.GetType()); MemoryStream stream = new MemoryStream(); try
protected XmlDocument SerializeAnObject(object obj)
{
XmlDocument doc = new XmlDocument();
DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
MemoryStream stream = new MemoryStream();
try
{
serializer.WriteObject(stream, obj);
stream.Position = 0;
doc.Load(stream);
return doc;
}
finally
{
stream.Close();
stream.Dispose();
}
}
最终我得到了如下结果:
<CaCT>
<CTC i:nil="true" xmlns="http://schemas.datacontract.org/2004/07/a.b.BusinessEntities.InnerEntities" />
<CTDescr xmlns="http://schemas.datacontract.org/2004/07/a.b.BusinessEntities.InnerEntities">blabla</CTDescr>
<CaId>464</CaId>
</CaCT>
布拉布拉
464
如何摆脱
I:nil=“true”
和xmlns=”http://schemas.datacontract.org/2004/07/a.b.BusinessEntities.InnerEntities“
?就我个人而言,我总是发现使用LINQ to XML手工编写的XML序列化工作得很好。它的灵活性随您的需要而定,您可以以任何方式使其向后和向前兼容,显然,您不会得到任何不需要的额外名称空间或属性
显然,类越复杂,它就越复杂,但我发现它对简单类非常有效。这至少是一个可供选择的选择。
我个人一直发现,使用LINQ到XML的手写XML序列化工作很好。它的灵活性随您的需要而定,您可以以任何方式使其向后和向前兼容,显然,您不会得到任何不需要的额外名称空间或属性
protected string SerializeAnObject(object obj)
{
XmlSerializerNamespaces xmlNamespaces = new XmlSerializerNamespaces();
xmlNamespaces.Add("", "");
XmlWriterSettings writerSettings = new XmlWriterSettings();
writerSettings.OmitXmlDeclaration = true;
XmlSerializer serializer = new XmlSerializer(obj.GetType());
using (MemoryStream ms = new MemoryStream())
{
using (XmlWriter stream = XmlWriter.Create(ms, writerSettings))
{
serializer.Serialize(stream, obj, xmlNamespaces);
return Encoding.UTF8.GetString(ms.ToArray());
}
}
}
显然,类越复杂,它就越复杂,但我发现它对简单类非常有效。这至少是一个可供选择的方案。我需要一个通用的方法来接收一个对象。我不能为每种类型编写序列化程序。@Naor:你的意思是你不知道需要什么类型?可能有多少种类型?如果您希望它是真正的泛型,并且只由代码编写和读取,那么为什么您关心XML中出现的名称空间等呢?我有30多种类型需要序列化。由于某些原因,我不知道,XML中出现的名称空间阻止我使用xslt文件转换数据。@Naor:如果您使用自动序列化,我将完全避免将xslt与之结合使用-尽管将xslt与名称空间的XML结合使用应该是完全可能的。@Naor-名称空间确实会使xslt更加尴尬,但所有xml操作(不仅仅是xslt)都是如此;使用xslt应该是完全可能的,但可能没有必要,除非您有需要—您没有状态—我需要一个接收对象的通用方法。我不能为每种类型编写序列化程序。@Naor:你的意思是你不知道需要什么类型?可能有多少种类型?如果您希望它是真正的泛型,并且只由代码编写和读取,那么为什么您关心XML中出现的名称空间等呢?我有30多种类型需要序列化。由于某些原因,我不知道,XML中出现的名称空间阻止我使用xslt文件转换数据。@Naor:如果您使用自动序列化,我将完全避免将xslt与之结合使用-尽管将xslt与名称空间的XML结合使用应该是完全可能的。@Naor-名称空间确实会使xslt更加尴尬,但所有xml操作(不仅仅是xslt)都是如此;应该完全可以使用xslt,但除非您有需要,否则可能没有必要使用xslt。答:对象是什么?如果我们看不见它,我们怎么能帮忙?B:对于细粒度的XML控制,XmlSerializer通常比DataContractSerializer@MarcGravell:但是XmlSerializer不知道如何处理像IEnumerable这样的接口。如果我必须比较这两个接口的特性,那么与例如,无法控制属性。A:对象是什么?如果我们看不见它,我们怎么能帮忙?B:对于细粒度的XML控制,XmlSerializer通常比DataContractSerializer@MarcGravell:但是XmlSerializer不知道如何处理像IEnumerable这样的接口。如果我必须比较这两个接口的特性,那么与例如,无法控制属性。次要注释-你可以用较少的间接方式序列化到StringEriter或类似文件-但我也会这样做。次要注释-你可以用较少的间接方式序列化到StringEriter或类似文件-但我也会这样做。
protected string SerializeAnObject(object obj)
{
XmlSerializerNamespaces xmlNamespaces = new XmlSerializerNamespaces();
xmlNamespaces.Add("", "");
XmlWriterSettings writerSettings = new XmlWriterSettings();
writerSettings.OmitXmlDeclaration = true;
XmlSerializer serializer = new XmlSerializer(obj.GetType());
using (MemoryStream ms = new MemoryStream())
{
using (XmlWriter stream = XmlWriter.Create(ms, writerSettings))
{
serializer.Serialize(stream, obj, xmlNamespaces);
return Encoding.UTF8.GetString(ms.ToArray());
}
}
}