51

を使用してutf-8 XMLファイルを生成しています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);

ファイルは正しく生成され、xsd ファイルで正常に検証されます。

XML ファイルをオンライン サービスにアップロードしようとすると、サービスはファイルがwrong at line 1;であると表示します。ファイルの最初のバイトの BOM が問題の原因であることを発見しました。

BOM がファイルに追加される理由と、BOM なしでファイルを保存する方法を知っていますか?

バイトオーダーマークウィキペディアの記事に記載されているように:

Unicode 標準では UTF-8 の BOM が許可され ていますが、必須でも推奨されていません。UTF-8 ではバイト オーダーは意味を持たないため、BOM は、テキスト ストリームまたはファイルを UTF-8 として識別するか、または BOM を持つ別の形式から変換されたことを識別するためにのみ機能します。

これはXDocument問題ですか、それともオンライン サービス プロバイダーの担当者に連絡して、パーサーのアップグレードを依頼する必要がありますか?

4

4 に答える 4

79

を使用してXmlTextWriterそれを XDocument の Save() メソッドに渡すと、使用するエンコーディングの種類をより詳細に制御できます。

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、BOM (バイト オーダー マーク) をブール値で使用するかどうかを指定するオーバーロードがありますfalse

このコードの結果は、ファイルのエンコーディングを検査するために Notepad++ を使用して検証されました。

于 2011-02-09T10:04:57.893 に答える
44

まず第一に、サービスプロバイダーは、UTF-8表現の場合にBOMが存在する可能性があると述べているXML仕様に従って、それを処理する必要があります。

次のように、BOMなしでXMLを強制的に保存できます。

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

(ここからGoogleで検索:http ://social.msdn.microsoft.com/Forums/en/xmlandnetfx/thread/ccc08c65-01d7-43c6-adf3-1fc70fdb026a )

于 2011-02-09T10:05:22.963 に答える