由DataContractSerializer创build的XML的格式
有没有一种简单的方法让DataContractSerializer吐出格式化的XML而不是一个长string? 我不想以任何方式更改标签或内容,只需要添加换行符和缩进来使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);
看看XmlWriterSettings
的Indent
属性
更新:这里是从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对我们的人更具可读性,但可能会干扰机器parsing。
根据XML标准 ,默认情况下,空白是显着的。 换句话说,就XML而言, 空白是满足的 。
如果将格式良好的XML馈送到XML Document对象中,则会得到与不包含空格或换行符的版本不同的结果。 您将获得添加到格式化版本的其他文本节点。
这篇关于XML White Space的 MSDN文章中有几个例子展示了如何处理棘手的空白。
如果您仅将XML格式化为供人使用,则无关紧要。 但是,如果您尝试将格式化的文档进行往返,则可能会遇到麻烦。
由于使用DataContractSerializer的关键主要优点之一是能够无缝地序列化对象和反序列化XML,通常最好是单独留下难看的输出。
我通常将输出粘贴到NotePad ++中,并且为了debugging目的而将其读取时运行一个XML-tidymacros。
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 ),与stream(和特定的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 } //... } }