XDocument: sauvegarder XML dans un fichier sans BOM

je suis de la génération d'un utf-8 XML le fichier à l'aide de 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.

quand j'essaie de télécharger le fichier XML vers un service en ligne, le service dit que mon fichier est wrong at line 1; j'ai découvert que le problème est causé par la NOMENCLATURE sur les premiers octets du fichier.

savez-vous pourquoi le BOM est ajouté au fichier et comment puis-je sauvegarder le fichier sans lui?

Comme indiqué dans le marque d'ordre d'Octet l'article de Wikipedia:

alors que la norme Unicode permet UTF-8 il ne nécessite pas ou recommander. L'ordre de Byte n'a pas ce qui signifie en UTF-8 donc un BOM seulement sert à identifier un flux de texte ou fichier UTF-8 ou qu'il a été converti d'un autre format qui a un BOM

Est un XDocument problème ou dois-je contacter le gars du fournisseur de services en ligne pour Demander une mise à jour de l'analyseur?

25
demandé sur systempuntoout 2011-02-09 11:46:30

3 réponses

utilisez un XmlTextWriter et passer à la XDocument la méthode Save() 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);
}

UTF8Encoding le constructeur de classe a une surcharge qui spécifie s'il faut ou non 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é en utilisant le bloc-notes++ pour inspecter l'encodage du fichier.

52
répondu Quick Joe Smith 2011-02-09 10:04:57

tout d'abord: le fournisseur de services doit s'en charger, selon la spécification XML, qui stipule que BOM peut être présent en cas de représentation UTF-8.

Vous pouvez forcer pour sauver votre XML sans BOM 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é d'ici: http://social.msdn.microsoft.com/Forums/en/xmlandnetfx/thread/ccc08c65-01d7-43c6-adf3-1fc70fdb026a)

23
répondu Dercsár 2011-02-09 10:05:22

la façon la plus rapide de se débarrasser du caractère BOM en utilisant XDocument est simplement d'enregistrer le document, puis faites un droit de lecture de Fichier comme un fichier, puis l'écrire. Le Fichier routines bande le caractère 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 il fonctionne pour des raisons de commodité - au moins vous aurez une bien formé fichier à télécharger à votre fournisseur en ligne) ;)

1
répondu Justin Rivers 2015-05-29 05:21:56