2011-11-02 88 views
5

我正在爲braindead企業XML API編寫包裝。我有一個XDocument,我需要變成一個字符串。由於這樣的事實,他們的XML解析器是如此挑剔,它甚至不能XML節點之間處理的空白,該文檔聲明必須正好:XDocument到字符串:如何省略聲明中的編碼?

<?xml version="1.0"?> 

然而,XDocument.Save()方法總是增加了編碼屬性在該聲明:

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

隨着花在谷歌和堆棧尋找生成XML字符串的最佳方式在過去一小時,我能做的最好的是:

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>