2009-06-29 68 views
15

我嘗試使用domainpeople.com API並且需要使用XML。Xdocument不打印聲明

目前我有一個錯誤說「找不到apiProtocol」我想我的Xml文檔格式不正確。

發送當前XML是:

<apiProtocol version="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNameSpaceSchemaLocation="checkrequest.xsd"> 
    <checkRequest user="ifuzion" password="fish4gold121" reference="123456789"> 
    <domain name="google.com" /> 
    </checkRequest> 
</apiProtocol> 

顯然,<?xml?>部分不打印出來。

我的代碼基本上是類似的東西:

XDocument xDocument = new XDocument(
new XDeclaration("1.0", "UTF-8", "yes"), 
new XElement("Books")); 

(我剝我的代碼的簡單問題,而是結構是完全相似)。

XDocument是否有任何理由不打印<?xml?>部分?它似乎與XmlDocument它的作品,但不與XDocument ...任何提示?

回答

16

如何打印出您的XDocument的內容?

.ToString()方法不包含xml頭,但.Save()方法。

編輯:給出了同樣的答案here

+0

是啊剛纔看到我需要的StringWriter .... 除了這似乎我可以把任何東西在編碼類型的聲明它仍然會使用UTF-16 ...目前正在尋找解決這個問題 – Erick 2009-06-29 20:13:06

+3

喲你找到了解決UTF-16問題?我經歷了同樣的事情。我想這是因爲.NET中的字符串是UTF-16,如果你沒有編碼成字節序列,它將始終是UTF-16? – User 2009-09-24 05:30:48

10

你怎麼保存呢?如果我這樣做,XML聲明出來,因爲它應該:

XDocument xDocument = new XDocument(
    new XDeclaration("1.0", "UTF-8", "yes"), 
    new XElement("Books")); 
xDocument.Save(@"c:\temp\file.xml"); 

輸出看起來是這樣的:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<Books /> 

但是,如果我不是傳遞一個XmlWriter的情況下,它看起來好像對於XmlWriter的設置改寫了在XDocument表示:

XDocument xDocument = new XDocument(
    new XDeclaration("1.0", "UTF-8", "yes"), 
    new XElement("Books")); 
StringBuilder sb = new StringBuilder(); 
using (XmlWriter writer = XmlWriter.Create(sb)) 
{ 
    xDocument.Save(writer); 
} 
Console.WriteLine(sb.ToString()); 

輸出看起來是這樣的:

<?xml version="1.0" encoding="utf-16" standalone="yes"?><Books /> 

請注意,編碼如何變爲「utf-16」並且縮進已更改。如果添加一個指示編碼的XmlWriterSettings實例(以及任何其他需要控制的設置),則會獲得更好的結果。下面的代碼做你所期望的:

XDocument xDocument = new XDocument(
    new XDeclaration("1.0", "UTF-8", "yes"), 
    new XElement("Books")); 
XmlWriterSettings settings = new XmlWriterSettings(); 
settings.Encoding = Encoding.UTF8; 
settings.ConformanceLevel = ConformanceLevel.Document; 
settings.Indent = true; 

using (XmlWriter writer = XmlWriter.Create(@"c:\temp\xdocument.xml", settings)) 
{ 
    xDocument.Save(writer); 
} 

輸出:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<Books /> 
1

解決方案序列化字符串:

// Default encode as Utf8 
Encoding outputEncoding = new UTF8Encoding(/*bom*/false); 

// Try to use Xml encoding 
if (xml.Declaration != null && 
    xml.Declaration.Encoding.ToNonNull().ToLower() != System.Text.Encoding.UTF8.WebName) 
{ 
    outputEncoding = System.Text.Encoding.GetEncoding(xml.Declaration.Encoding); 
} 

using (var stream = new MemoryStream()) 
{ 
    using (new XmlTextWriter(stream, outputEncoding)) 
    { 
     xml.Save(stream); 
    } 

    return outputEncoding.GetString(stream.ToArray()); 
}