C# 格式化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

我使用此方法将对象转换为XML:

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());
        }
    }
}