1. ホーム
  2. c#

[解決済み] xml.LoadData - ルートレベルのデータが無効です。1行目、位置1

2022-02-27 03:32:33

質問

WiXインストーラの中でXMLを解析しようとしています。このXMLは、Webサーバーから返されたすべてのエラーのオブジェクトになります。私は、このコードで質問のタイトルのエラーを取得しています。

XmlDocument xml = new XmlDocument();
try
{
    xml.LoadXml(myString);
}
catch (Exception ex)
{
    System.IO.File.WriteAllText(@"C:\text.txt", myString + "\r\n\r\n" + ex.Message);
    throw ex;
}

myString はこれ(の出力に見られるように text.txt )

<?xml version="1.0" encoding="utf-8"?>
<Errors></Errors>

text.txt はこのように出てきます。

<?xml version="1.0" encoding="utf-8"?>
<Errors></Errors>

Data at the root level is invalid. Line 1, position 1.

このXMLをパースして、何かエラーがあったかどうかを確認する必要があります。

どのように解決するのですか?

隠し文字はBOMと思われます。 この問題の説明と解決策は、以下のページにあります。 こちら James Brankinの解答を基にJames Schubertが作成しました。 こちら .

先の回答では、隠し文字は削除されましたが、1行目全体も削除されています。より正確には、次のようになります。

string _byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
if (xml.StartsWith(_byteOrderMarkUtf8))
{
    xml = xml.Remove(0, _byteOrderMarkUtf8.Length);
}

Azure blobからXSLTファイルを取得し、XslCompiledTransformオブジェクトに読み込む際に、この問題に遭遇しました。 私のマシンでは、ファイルは正常に見えましたが、それを blob としてアップロードし、それをフェッチバックした後、BOM 文字が追加されました。