次のコードを検討してください。
[Test]
public void StackOverflowQuestionTest()
{
const string connectionString = "enter your connection string if you wanna test this code";
byte[] result = null;
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
using (var sqlCommand = new SqlCommand("declare @xml as xml = '<xml/>' SELECT convert(varbinary(max), @xml) as value"))
//using (var sqlCommand = new SqlCommand("SELECT convert(varbinary(max), N'<xml/>') as value"))
{
sqlCommand.Connection = connection;
using (SqlDataReader reader = sqlCommand.ExecuteReader())
{
while (reader.Read())
{
result = (byte[])reader["value"];
}
reader.Close();
}
}
}
string decodedString = new UnicodeEncoding(false, true).GetString(result);
var document = XElement.Parse(decodedString);
}
このテストを実行すると、「ルート レベルのデータが無効です。行 1、位置 1」というメッセージを含む XmlException が発生します。結局のところ、問題は無効な文字と見なされる「0xFFFE」プリアンブルです。代わりにコメント付きの文字列を使用すると、すべてが正常に機能することに注意してください。これは、私にとっては奇妙です。SqlServer は BOM を使用して UCS-2 に XML 文字列を格納すると同時に、BOM なしで nvarchar 値を格納するようです。主な質問は、このバイト配列をこのプリアンブル (BOM) を含まない文字列にデコードするにはどうすればよいですか?