次の方法で共有


XmlDocument.LoadするときXmlファイルに日本語があるとエラーになります。

質問

2015年7月14日火曜日 4:55

こんにちは。

Xmlファイルを読み込む処理を作っています。

読み込むXmlファイルはUTF-8です。

これを

XmlDocument.Load(ファイルPath)で読み込むとき、対象のXmlファイルに日本語があれば、無効な文字がありますとエラーになります。

日本語がなければエラーにならず、Xmlファイルを正常に読み込めます。

このXmlファイルのenocdeをUTF-8ではなくSHIFT_JISにしてみたら日本語があっても正常に動作しました。

しかし、このXMLファイルは必ずUTF-8になっています、ということで...プログラムでエラーを解決するしかない状態です。

いろいろ試してみましたが全部失敗し、最後に

xmldoc.Load(File.ReadAllText(inputInfo, System.Text.Encoding.GetEncoding("shift_jis")));

こういう方法を見つけていけると思って試してみましたが、今度はPathに無効な文字がありますというまた別のエラーになって結局失敗しました。

(ファイル名が日本語だから..?)

解決策がご存知の方いらっしゃればぜひ教授いただきたいと思います。よろしくお願いします。

すべての返信 (3)

2015年7月14日火曜日 5:08

質問してすぐ自己解決しちゃってすみませんが、情報共有のために質問は残します。

Loadで読んでいるのをLoadXmlにしたら解決しました。

つまり、UTF-8になっていて日本語があるXMLファイルをXmlDocument.Loadで読み込むとき、無効な文字があります、というエラーになる問題は

File.ReadAllText(inputInfo, System.Text.Encoding.GetEncoding("shift_jis"))でXMLファイルのEncodeをshift_jisに設定してくれれば治ると思います。しかし、こうした場合、XmlDocument.LoadではなくてXmlDocument.LoadXmlにしなければまた別のエラーになりました。

最終的に下記のようにしました。

xmldoc.LoadXml(File.ReadAllText(inputInfo, System.Text.Encoding.GetEncoding("shift_jis")));


2015年7月14日火曜日 5:12

具体的なコードと正確な例外を記載してください。正確な情報がなければどんな問題が発生しているかは実際に例外を見た質問者さんにしかわかりません。その際、複数の処理を1行にまとめず、どのメソッドで例外が発生しているのかも把握できるようにしてください。

また、ファイルコンテンツのエンコーディングとファイル名のエンコーディングの話題があるようですので、その辺りも明確に記述してください。


2015年7月14日火曜日 8:10

少なくとも当方で実験した限りでは、「UTF-8 の XML ファイル」を「Shift_JIS で読み込まねばならない」という事象は確認できませんした。

string src = "<日本語/>";
File.WriteAllText(inputFile, src, Encoding.GetEncoding("UTF-8"));

XmlDocument xmlDoc1 = new XmlDocument();
xmlDoc1.Load(inputFile);

XmlDocument xmlDoc2 = new XmlDocument();
xmlDoc2.LoadXml(File.ReadAllText(inputFile, Encoding.GetEncoding("UTF-8")));

元の XML ファイルのエンコードが何になっているのかを最初に確認してみて下さい。
もしかしたら、そもそもの XML ファイル自体が破損している可能性もあるかもしれません。

  • Windows の メモ帳 (notepad.exe)で、メニューから「ファイル」-「開く」を選択し、そのダイアログの「文字コード」欄を指定した上で、その XML ファイルを開いてみて下さい。文字化けなく開けるのは、どの文字コードを指定した時でしょうか?
  • 文字化けなく開くことができたなら、ファイルの先頭にある「<?xml version="1.0" encoding="★★"?>」の記述を確認してみてください。この宣言部は、encoding指定無しで「<?xml version="1.0"?>」と表記される場合もありますし、そもそも XML 宣言そのものが付与されていないケースもあります。
  • XML ファイルそのものが、"UTF-8" あるいは "UTF-16" で保存されていた場合、XML 宣言部による encoding="★★" の指定を省略できます。それ以外の文字コード(たとえば Shift_JIS) で保存されたファイルでは、encoding 指定付きのXML 宣言部が必要です。
  • もちろん、実際に保存されている文字コードと、encoding 指定に食い違いがあってはいけません。しかしここが正しく設定されているのであれば、Load メソッドでも LoadXml メソッドでも同じように読み取ることが出来るはずです。