web-dev-qa-db-fra.com

XDocument: enregistrement XML dans un fichier sans nomenclature

Je génère un fichier utf-8 XML en utilisant XDocument.

XDocument xml_document = new XDocument(
                    new XDeclaration("1.0", "utf-8", null),
                    new XElement(ROOT_NAME,                    
                    new XAttribute("note", note)
                )
            );
...
xml_document.Save(@file_path);

Le fichier est généré correctement et validé avec succès avec un fichier xsd.

Lorsque j'essaie de télécharger le fichier XML vers un service en ligne, le service indique que mon fichier est wrong at line 1; J'ai découvert que le problème est dû à la nomenclature sur les premiers octets du fichier.

Savez-vous pourquoi la nomenclature est ajoutée au fichier et comment puis-je enregistrer le fichier sans lui?

Comme indiqué dans marque d'ordre des octets article Wikipedia:

Bien que la norme Unicode autorise la nomenclature en UTF-8 , elle ne l'exige pas ni ne la recommande . L'ordre des octets n'a pas de sens en UTF-8, donc une nomenclature ne sert qu'à identifier un flux de texte ou un fichier comme UTF-8 ou qu'il a été converti à partir d'un autre format doté d'une nomenclature.

Est-ce un problème de XDocument ou dois-je contacter les gars du fournisseur de services en ligne pour demander une mise à niveau de l'analyseur?

41
systempuntoout

Utilisez un XmlTextWriter et transmettez-le à la méthode Save () de XDocument, de cette façon, vous pouvez avoir plus de contrôle sur le type de codage utilisé:

var doc = new XDocument(
    new XDeclaration("1.0", "utf-8", null),
    new XElement("root", new XAttribute("note", "boogers"))
);
using (var writer = new XmlTextWriter(".\\boogers.xml", new UTF8Encoding(false)))
{
    doc.Save(writer);
}

Le UTF8Encoding Le constructeur de classe a une surcharge qui spécifie s'il faut utiliser le BOM (Byte Order Mark) avec une valeur booléenne, dans votre cas false.

Le résultat de ce code a été vérifié à l'aide de Notepad ++ pour inspecter l'encodage du fichier.

69
Quick Joe Smith

Tout d'abord: le fournisseur de services DOIT le gérer, conformément à la spécification XML, qui stipule que la nomenclature peut être présente en cas de représentation UTF-8.

Vous pouvez forcer à enregistrer votre XML sans nomenclature comme ceci:

XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = new UTF8Encoding(false); // The false means, do not emit the BOM.
using (XmlWriter w = XmlWriter.Create("my.xml", settings))
{
    doc.Save(w);
}

(Googlé à partir d'ici: http://social.msdn.Microsoft.com/Forums/en/xmlandnetfx/thread/ccc08c65-01d7-43c6-adf3-1fc70fdb026a )

30
Dercsár

Le moyen le plus rapide de se débarrasser du caractère de nomenclature lors de l'utilisation de XDocument consiste simplement à enregistrer le document, puis à lire un fichier directement en tant que fichier, puis à le réécrire. Les routines de fichiers suppriment le personnage pour vous:

        XDocument xTasks = new XDocument();
        XElement xRoot = new XElement("tasklist",
            new XAttribute("timestamp",lastUpdated),
            new XElement("lasttask",lastTask)
        );
        ...
        xTasks.Add(xRoot);
        xTasks.Save("tasks.xml");

        // read it straight in, write it straight back out. Done.
        string[] lines = File.ReadAllLines("tasks.xml");
        File.WriteAllLines("tasks.xml",lines);

(C'est hoky, mais cela fonctionne par souci d'opportunité - au moins, vous aurez un fichier bien formé à télécharger sur votre fournisseur en ligne);)

0
Justin Rivers