【问题标题】:format the xml output格式化xml输出
【发布时间】:2011-10-16 07:48:56
【问题描述】:

我正在使用这种方法将对象转换为 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>

我怎样才能摆脱i:nil="true"xmlns="http://schemas.datacontract.org/2004/07/a.b.BusinessEntities.InnerEntities"

【问题讨论】:

  • 答:对象是什么?如果我们看不到它,我们如何提供帮助? B:对于细粒度的 XML 控件,XmlSerializer 一般优于 DataContractSerializer
  • @Marc Gravell:但是 XmlSerializer 不知道如何处理像 IEnumerable 这样的接口。
  • 如果我必须比较两者的特性,与无法控制属性相比,缺少 IEnumerable(很容易被列表等绕过)将显得微不足道。

标签: c# .net xml serialization xml-serialization


【解决方案1】:

就我个人而言,我一直发现使用 LINQ to XML 的手写 XML 序列化效果很好。它随心所欲地灵活,您可以以任何您想要的方式使其向后和向前兼容,并且显然您最终不会得到任何您不想要的额外命名空间或属性。

显然,你的类越复杂,它就越复杂,但我发现它对于简单的类非常有效。这至少是一个可以考虑的替代方案。

【讨论】:

  • 我需要一个接收对象的通用方法。我无法为每种类型编写序列化程序。
  • @Naor:你的意思是你不知道你会期待什么类型?可能有几种类型?如果您希望它是真正通用的,并且只能由代码编写和读取,那么您为什么要关心 XML 中出现的命名空间等?
  • 我有更多的 30 种类型要序列化。由于某些我不知道的原因,出现在 XML 中的命名空间阻止我使用 xslt 文件转换数据。
  • @Naor:如果您使用的是自动序列化,我将完全避免使用 XSLT - 尽管完全可能将 XSLT 与命名空间 XML 一起使用.
  • @Naor - 命名空间确实让 xslt 更尴尬,但对于 all xml 操作(不仅仅是 xslt)而言,情况确实如此;应该完全可以使用 xslt - 但可能不是必要的,除非你有没有说明的需求
【解决方案2】:
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());
        }
    }
}

【讨论】:

  • 次要注意 - 您可以序列化为 StringEriter 或类似的间接更少的 - 但这基本上也是我将要处理的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 2012-12-07
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 2015-06-15
相关资源
最近更新 更多