2009-06-29 10 views
15

J'essaie d'utiliser l'API domainpeople.com et d'utiliser XML.Xdocument n'imprime pas la déclaration

Actuellement, j'ai une erreur en disant "apiProtocol n'est pas trouvé" Je suppose que mon document XML est mal formé.

Le xml est envoyé:

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

Apparemment, la partie <?xml?> n'imprime pas.

Mon code est fondamentalement quelque chose de semblable à:

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

(je retirai mon code pour une question de simplicité, mais la structure est exactement similaire).

Y a-t-il une raison pour laquelle XDocument n'imprime pas la pièce <?xml?>? Il semble qu'avec XmlDocument cela fonctionne mais pas avec XDocument ... des indices?

Répondre

16

Comment imprimez-vous le contenu de votre XDocument?

La méthode .ToString() n'inclut pas l'en-tête XML, mais la méthode .Save().

Modifier: La même réponse a été donnée here.

+0

Eh oui juste vu que je avais besoin d'un StringWriter .... autre que cela, il semble que je peux mettre quelque chose dans le type d'encodage pour la déclaration, il utilisera toujours UTF-16 ... recherche actuellement pour résoudre ce problème – Erick

+3

Did yo Vous trouvez un correctif pour le problème UTF-16? Je ressens la même chose. Je suppose que c'est parce que les chaînes dans .NET sont UTF-16, et si vous ne cryptez pas sur une séquence d'octets, ce sera toujours UTF-16? – User

+0

Il semble que la réponse de Mörk offre un correctif potentiel (http://stackoverflow.com/questions/1060164/xdocument-does-not-print-declaration/1060282#1060282), mais vous devez traduire manuellement entre un 'XDeclaration.Encoding 'string et un format' Encoding' de sortie réel. – patridge

10

Comment pouvez-vous sauver? Si je fais ce qui suit, la déclaration xml est comme il se doit:

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

La sortie ressemble à ceci:

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

Cependant, si je passe à la place une instance de XmlWriter, il semble que si le paramètres de ce XmlWriter outrepasse ce qui est indiqué dans le 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()); 

la sortie ressemble à ceci:

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

Notez que le codage a été remplacé par "utf-16" et que l'indentation a changé. Si vous ajoutez une instance de XmlWriterSettings indiquant l'encodage (et tous les autres paramètres que vous souhaitez contrôler), vous obtenez un meilleur résultat.Le code suivant fait ce que vous attendez:

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

Sortie:

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

Solution pour la sérialisation à la chaîne:

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

s'il vous plaît expliquer. – johannes

Questions connexes