DataContractSerializer 创建的 XML 的格式
-
09-09-2019 - |
题
有没有一种简单的方法可以让 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
}
//...
}
}
不隶属于 StackOverflow