有没有一种简单的方法可以让 DataContractSerializer 吐出格式化的 XML 而不是一个长字符串?我不想以任何方式更改标签或内容,只是添加换行符和缩进以使 XML 更具可读性?

<tagA>
   <tagB>This is</tagB>   
   <tagC>Much</tagC>
   <tagD>
      <tagE>easier to read</tagE>
   </tagD>
</tagA>


<tagA><tagB>This is</tagB><tagC>Much</tagC><tagD><tagE>harder to read</tagE></tagD></tagA>
有帮助吗?

解决方案

由于bendewey说,XmlWriterSettings是你所需要的 - 例如,类似

var ds = new DataContractSerializer(typeof(Foo));

var settings = new XmlWriterSettings { Indent = true };

using (var w = XmlWriter.Create("fooOutput.xml", settings))
    ds.WriteObject(w, someFoos);

其他提示

看看 Indent 的财产 XmlWriterSettings

更新: 这是 MSDN 上的一个很好的链接 如何:指定 XmlWriter 上的输出格式

此外,这里有一个示例:

class Program
{
    static void Main(string[] args)
    {
        var Mark = new Person()
        {
            Name = "Mark",
            Email = "mark@example.com"
        };

        var serializer = new DataContractSerializer(typeof(Person));

        var settings = new XmlWriterSettings()
        {
            Indent = true,
            IndentChars = "\t"
        };

        using (var writer = XmlWriter.Create(Console.Out, settings))
        {
            serializer.WriteObject(writer, Mark);
        }
        Console.ReadLine();
    }
}
public class Person
{
    public string Name { get; set; }
    public string Email { get; set; }
}

要小心在XML文档中调整空白!调整空白将使XML为我们人类更可读的,但它可能与机器分析干涉。

按照 XML标准时,空白是显著默认。换句话说,只要XML而言,白色空间为内容

如果你给你很好的格式化XML到XML文档对象,你会得到不同的结果比没有空格或换行符在它的版本。您将获得加入到已格式化版本的其他文本节点。

XML空格,这MSDN文章,有几个例子,说明白如何棘手空间即可。

如果你只格式化供人类食用的XML,也没关系。但是,如果你尝试往返您格式的文档,你可能会遇到麻烦。

由于使用的DataContractSerializer的关键主要优点之一是将对象序列和反序列化XML 无缝,它通常是最好单独离开难看输出的能力。

我通常粘贴输出到记事本++和在其上运行的XML-整齐宏当我想读它用于调试目的。

    public static string SerializeEntity<T>(T source)
    {
        using (MemoryStream ms = new MemoryStream())
        {

                NetDataContractSerializer serializer = new NetDataContractSerializer();
                serializer.Serialize(ms, source);
                return System.Text.Encoding.ASCII.GetString(ms.ToArray());

        }
    }

    public static T DeSerializeEntity<T>(string xml)
    {
        using (MemoryStream ms = new MemoryStream(System.Text.Encoding.ASCII.GetBytes(xml)))
        {
                NetDataContractSerializer serializer = new NetDataContractSerializer();
                return (T)serializer.Deserialize(ms);
        }
    }
基于使用的XmlWriter此处公布的其它样品

,这里有一个版本(从 http://ClipFlair.codeplex.com )与流(在特定Ionic.Zip库的作品),也显示了该代码是如何当你不应用格式(使用条件编译 - 只是注释掉的#define使它写格式化XML)

#define WRITE_FORMATTED_XML

using System.Xml;

namespace ClipFlair.Windows
{

  public partial class BaseWindow : FloatingWindow
  {

    //...

    #if WRITE_FORMATTED_XML
    private static XmlWriterSettings XML_WRITER_SETTINGS = new XmlWriterSettings() { Indent=true, IndentChars="  "};
    #endif

    //...

    public virtual void SaveOptions(ZipFile zip, string zipFolder = "") //THIS IS THE CORE SAVING LOGIC
    {
      if (SavingOptions != null) SavingOptions(this, null); //notify any listeners

      View.Busy = true;
      try
      {
        ZipEntry optionsXML = zip.AddEntry(zipFolder + "/" + View.GetType().FullName + ".options.xml",
          new WriteDelegate((entryName, stream) =>
          {
            DataContractSerializer serializer = new DataContractSerializer(View.GetType()); //assuming current View isn't null
            #if WRITE_FORMATTED_XML
            using (XmlWriter writer = XmlWriter.Create(stream, XML_WRITER_SETTINGS))
              serializer.WriteObject(writer, View);
            #else
            serializer.WriteObject(stream, View);
            #endif
          }));
      }
      catch (Exception e)
      {
        MessageBox.Show("ClipFlair options save failed: " + e.Message); //TODO: find the parent window
      }
      finally
      {
        View.Busy = false; //in any case (error or not) clear the Busy flag
      }

      if (SavedOptions != null) SavedOptions(this, null); //notify any listeners
    }

    //...

  }

}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top