88

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 を解析する必要があります。

4

11 に答える 11

146

隠しキャラはおそらくBOM。問題の説明と解決策は、ここで見つけることができます。James Schubert の功績によるもので、James Brankin による回答に基づいています

前の回答では隠し文字が削除されますが、最初の行全体も削除されます。より正確なバージョンは次のようになります。

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

Azure BLOB から XSLT ファイルを取得し、それを XslCompiledTransform オブジェクトに読み込むときに、この問題が発生しました。私のマシンでは、ファイルは問題ないように見えましたが、BLOB としてアップロードしてフェッチした後、BOM 文字が追加されました。

于 2015-01-02T14:13:22.637 に答える
16

ここでの問題は、myStringそのヘッダー行があったことです。最初の行の先頭に隠し文字があったか、行自体がエラーの原因でした。最初の行を次のように切り取りました。

xml.LoadXml(myString.Substring(myString.IndexOf(Environment.NewLine)));

これで私の問題は解決しました。

于 2013-07-22T19:31:34.107 に答える
10

問題はエンコードに関するものだと思います。そのため、最初の行 (エンコーディング バイトを含む) を削除すると問題が解決する場合があります。

ルート レベルのデータに対する私のソリューションは無効です。行 1、位置 1.XDocument.Parse(xmlString)それを置き換えていましたXDocument.Load( new MemoryStream( xmlContentInBytes ) );

xml 文字列が正常に見えることに気付きました。

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

しかし、別のテキスト エディター エンコーディングでは、次のようになりました。

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

最後に、xml 文字列は必要ありませんでしたが、xml バイト [] が必要でした。文字列を使用する必要がある場合は、文字列内の「見えない」バイトを探し、エンコーディングを操作して、解析または読み込み用に xml コンテンツを調整する必要があります。

それが役立つことを願っています

于 2015-09-22T09:25:30.110 に答える