1つの長い文字列ではなく、フォーマットされたXMLをDataContractSerializerに出力させる簡単な方法はありますか?タグやコンテンツを変更したくないので、改行とインデントを追加して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 = "[email protected]"
};
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 Documentオブジェクトにフィードすると、スペースや改行がないバージョンとは異なる結果が得られます。フォーマットされたバージョンに追加されたテキストノードが追加されます。
XMLホワイトスペース に関するこのMSDNの記事には、トリッキーなホワイトスペースがどのように扱いにくいかを示すいくつかの例があります。
人間が使用するためだけにXMLをフォーマットする場合、それは問題ではありません。しかし、フォーマットされたドキュメントをラウンドトリップしようとすると、問題が発生する可能性があります。
DataContractSerializerを使用する主な主な利点の1つは、オブジェクトをシリアル化してXMLを逆シリアル化する機能をシームレスにできるため、醜い出力はそのままにしておくことをお勧めします。
私は通常、出力をNotePad ++に貼り付け、デバッグのためにそれを読みたいときに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を使用するここに投稿された他のサンプルに基づいて、ストリーム(およびIonic.Zipライブラリ)で機能するバージョン( http://ClipFlair.codeplex.com から)と、その方法も示しますコードは、フォーマットを適用しない場合です(条件付きコンパイルを使用-#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
}
//...
}
}