Mono - LoadOptions.PreserveWhitespaceでXDocument.Loadが失敗する

Monoバージョン2.10.5を使用すると、次のコードはどのXMLドキュメントでも失敗します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Xml.Linq;

namespace TestXDocument
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            Stream s = File.Open("Settings.xml", FileMode.Open);
            XDocument d = XDocument.Load(s, LoadOptions.PreserveWhitespace);
            s.Close();
            d.Save("Settings.xml");
        }
    }
}

これは、XDocument.LoadがLoadOptions.PreserveWhitespaceを使用する場合にのみ発生します。どのようにこれを回避するか、または問題を解決する上で任意のアイデア?

Linux Mint 12とUbuntu 11.10でテスト済みです。

以下は例外です:

 Unhandled Exception: System.InvalidOperationException: This XmlWriter does not accept Text at this state Prolog.
  at System.Xml.XmlTextWriter.ShiftStateContent (System.String occured, Boolean allowAttribute) [0x00000] in :0 
  at System.Xml.XmlTextWriter.WriteString (System.String text) [0x00000] in :0 
  at System.Xml.DefaultXmlWriter.WriteString (System.String text) [0x00000] in :0 
  at System.Xml.Linq.XText.WriteTo (System.Xml.XmlWriter w) [0x00000] in :0 
  at System.Xml.Linq.XDocument.WriteTo (System.Xml.XmlWriter w) [0x00000] in :0 
  at System.Xml.Linq.XDocument.Save (System.Xml.XmlWriter w) [0x00000] in :0 
  at System.Xml.Linq.XDocument.Save (System.String filename, SaveOptions options) [0x00000] in :0 
  at System.Xml.Linq.XDocument.Save (System.String filename) [0x00000] in :0 
  at TestXDocument.MainClass.Main (System.String[] args) [0x00000] in :0 
[ERROR] FATAL UNHANDLED EXCEPTION: System.InvalidOperationException: This XmlWriter does not accept Text at this state Prolog.
  at System.Xml.XmlTextWriter.ShiftStateContent (System.String occured, Boolean allowAttribute) [0x00000] in :0 
  at System.Xml.XmlTextWriter.WriteString (System.String text) [0x00000] in :0 
  at System.Xml.DefaultXmlWriter.WriteString (System.String text) [0x00000] in :0 
  at System.Xml.Linq.XText.WriteTo (System.Xml.XmlWriter w) [0x00000] in :0 
  at System.Xml.Linq.XDocument.WriteTo (System.Xml.XmlWriter w) [0x00000] in :0 
  at System.Xml.Linq.XDocument.Save (System.Xml.XmlWriter w) [0x00000] in :0 
  at System.Xml.Linq.XDocument.Save (System.String filename, SaveOptions options) [0x00000] in :0 
  at System.Xml.Linq.XDocument.Save (System.String filename) [0x00000] in :0 
  at TestXDocument.MainClass.Main (System.String[] args) [0x00000] in :0 
5
Monoの問題を公式のbugzilla、 mono-project.com/Bugs で報告する方法を学ぶ必要があります。
追加された 著者 Lex Li,
質問はありますか?
追加された 著者 sehe,
これが起こるだけです:とにかく、どうなりますか?鼻の悪魔?メッセージ?
追加された 著者 sehe,
ここでの質問は、どのように解決できるか、それを回避することです。
追加された 著者 Drew DeVault,
私は例外で編集しました。
追加された 著者 Drew DeVault,

1 答え

Ubuntu 11.10の両方のコード例で同じ問題を再現できました。あなたが言ったように、Windowsプラットフォームには何の問題もありません。 Monoランタイムには、XDocumentのSaveメソッドに特定のバグがあり、予期しないエラーが発生するようです。この問題は、ソフトウェアパッチのMonoランタイムチームに報告したいと思います。

しかし、私がここにもたらす可能性のある回避策は、

d.Root.Save("Settings1.xml");

私たちがXDocumentで遭遇したように、XElementのSaveメソッドには何の問題もないようです。

3
追加された
ニースの回避策。ありがとう!注意するには、 PreserveWhitespace オプションは <true /> に変わっているので、オリジナルの完全な空白ファイル。私は Mono 2.10.9 を使ってMac上でのみ、これをウィンドウでチェックしていません。
追加された 著者 cod3monk3y,
残念ながら、これは私にとってはうまくいかないでしょう。 Info.plist ファイルは d.Root.Save で保存されていないDOCTYPEタグ <!DOCTYPE plist PUBLIC ... で始まります。 LoadOptions.None に戻ると思います!
追加された 著者 cod3monk3y,