2009-06-29 23 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

+3

yo UTF-16問題の修正を見つけましたか?私は同じことを経験する。 .NETの文字列はUTF-16なので、バイトシーケンスにエンコードしていないのであれば、それは常にUTF-16でしょうか? – User

+0

Mörkの答えは潜在的な修正を提供するようですが(http://stackoverflow.com/questions/1060164/xdocument-does-not-print-declaration/1060282#1060282)、手動で 'XDeclaration.Encoding '文字列と実際の出力' Encoding'形式です。 – patridge

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()); 

出力は次のようになります210

<?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()); 
} 
+0

をご説明ください。 – johannes

関連する問題