2011-11-02 17 views
5

私はbraindeadエンタープライズXML APIのラッパーを作成しています。私は文字列に変換する必要があるXDocumentを持っています。それらのXMLパーサがそれもXMLノード間の空白を扱うことができないほど凝り性であるという事実のために、ドキュメント宣言を正確に入力する必要があり:XDocument to string:宣言でエンコードを省略するには?

<?xml version="1.0"?> 

しかし、XDocument.Save()メソッドは常にエンコーディングを追加その宣言内の属性:XML文字列を生成するための最良の方法を探して、Googleやスタックに費やした過去の時間で

<?xml version="1.0" encoding="utf-16"?> 

は、私ができる最善のは、次のとおりです。

string result = xmlStringBuilder.ToString().Replace(@"encoding=""utf-16"", string.Empty)); 

は私が

xdoc.Declaration = new XDeclaration("1.0", null, null); 

を試みたし、それはXDocumentに私がそれを望むように宣言を設定することで成功ありません。しかし、私がSave()メソッドを呼び出すと、どのようなルート(TextWriterの使用、XmlWriterSettingsの追加など)に関係なく、エンコーディング属性が魔法のようにそこに戻されます。

誰かがこれを行うための良い方法がありますか、または私のコードは、厄介な文字列の上にコメントで怒鳴るの段落を永遠に運命ですか?

答えて

10

受信側はXMLパーサーを使用するように修正する必要がありますが、XML構文で破損するものではなく、.NETで宣言すると、XML宣言付きの文字列を作成する場合は、

public class MyStringWriter : StringWriter 
{ 
    public override Encoding Encoding 
    { 
     get 
     { 
      return null; 
     } 
    } 
} 

、次いで

XDocument doc = new XDocument(
     new XDeclaration("1.0", null, null), 
     new XElement("root", "test") 
     ); 

    string xml; 

    using (StringWriter msw = new MyStringWriter()) 
    { 
     doc.Save(msw); 
     xml = msw.ToString(); 
    } 

    Console.WriteLine(xml); 

出力

<?xml version="1.0"?> 
<root>test</root> 
関連する問題