XML宣言がXDocument(XElement)のsaveメソッドを読んだときにしか追加されない(オブジェクト自体に追加されるわけではなく、保存されたファイルに追加される)ので、結局StringBuilderでXMLを書いています。XDocumentの方から宣言を設定もしくは取得するプロパティも有るんだけど、それを使ってもダメ。これはどうすれば。。。

はてなダイアリーにAtomPudで投稿する - INOHILOG

もうちょっと親切なクラスであれば嬉しいんですが、どうやらSaveメソッドを呼ぶしか無いみたい?(他にあれば伝授してください!)なのですが、ファイルではなくStringBuilderに出力することもできるので以下のように書けます。

var sb = new StringBuilder();
var settings = new XmlWriterSettings() { Indent = true, OmitXmlDeclaration = false };

// ここはほぼそのままコピペ
XNamespace xname = "http://purl.org.atom/ns#";
XDocument doc = new XDocument(
	new XDeclaration( "1.0", "utf-8", "no" ),
	new XElement( xname + "entry",
		new XElement( "title", "title2" ),
		new XElement( "content", new XAttribute( "type", "text/plain" ), "content2" ),
		new XElement( "updated",
		              DateTime.Now.ToString( "o", new System.Globalization.CultureInfo( "ja-jp" ))))
);

using ( XmlWriter writer = XmlWriter.Create( sb, settings ) )
{
	Console.WriteLine( doc.Declaration );
	Console.WriteLine();

	doc.Save( writer );
	writer.Flush();
	Console.WriteLine( sb );
}
<?xml version="1.0" encoding="utf-8" standalone="no"?>

<?xml version="1.0" encoding="utf-16" standalone="no"?>
<entry xmlns="http://purl.org.atom/ns#">
  <title xmlns="">title2</title>
  <content type="text/plain" xmlns="">content2</content>
  <updated xmlns="">2008-09-14T01:55:49.0410000+09:00</updated>
</entry>
続行するには何かキーを押してください . . .


しかしなぜか出力のencoding部分がおかしいです!必ずutf-16になってしまう。
色々試してみたけどダメだった。何がおかしいのでしょう。。。
XDeclaration.ToString()+XDocument.ToString()の方が早い気がしてきた今日この頃。