2009-06-29 15 views
15

Ich versuche, die domepagepeople.com-API zu verwenden, und ich muss XML verwenden.Xdocument druckt keine Deklaration

Derzeit habe ich eine Fehlermeldung, dass "apiProtocol nicht gefunden wird" Ich denke dann, dass mein Xml-Dokument fehlerhaft ist.

Die aktuelle XML gesendet ist:

<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> 

Anscheinend ist der <?xml?> Teil druckt nicht aus.

Mein Code ist im Grunde so etwas wie:

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

(ich meinen Code für eine Frage der Einfachheit gestrippt aber die Struktur ist genau ähnlich).

Gibt es einen Grund, warum XDocument das <?xml?> Teil nicht ausdruckt? Es scheint, dass mit XmlDocument es funktioniert, aber nicht mit XDocument ... irgendwelche Hinweise?

Antwort

16

Wie drucken Sie den Inhalt Ihres XDocument aus?

Die .ToString()-Methode enthält nicht den XML-Header, aber die .Save()-Methode funktioniert.

Bearbeiten: Die gleiche Antwort wurde here gegeben.

+0

Yup gerade gesehen, dass ich einen String benötigt .... außer dass es scheint, dass ich alles in den Kodierungstyp für die Deklaration setzen kann, wird es immer noch UTF-16 verwenden ..., das zurzeit sucht, um das zu beheben – Erick

+3

Did yo Finden Sie eine Lösung für das UTF-16-Problem? Ich erlebe dasselbe. Ich schätze, weil Strings in .NET UTF-16 sind, und wenn Sie nicht in eine Byte-Sequenz codieren, wird es immer UTF-16 sein? – User

+0

Es sieht so aus, als ob Mörks Antwort eine mögliche Lösung bietet (http://stackoverflow.com/questions/1060164/xdocument-does-not-print-declaration/1060282#1060282), aber Sie müssen manuell zwischen einem 'XDeclaration.Encoding' übersetzen 'string und eine tatsächliche Ausgabe' Encoding' Format. – patridge

10

Wie Sie es speichern? Wenn ich den folgenden Code, kommt die XML-Deklaration aus, wie es sollte:

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

Allerdings, wenn ich stattdessen eine XmlWriter-Instanz übergeben, so scheint es, als ob das:

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

Die Ausgabe sieht wie folgt aus Einstellungen für die XmlWriter überschreiben, was in den XDocument erklärt:

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

die Ausgabe sieht wie folgt aus:

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

Beachten Sie, wie sich die Codierung in "utf-16" geändert hat und der Einzug geändert wurde. Wenn Sie eine XmlWriterSettings-Instanz hinzufügen, die die Codierung angibt (und alle anderen Einstellungen, die Sie steuern möchten), erhalten Sie ein besseres Ergebnis.Der folgende Code tut, was Sie erwarten:

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

Ausgang:

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

Lösung für die Serialisierung zu string:

// 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

bitte erklären. – johannes

Verwandte Themen