QA@IT

XmlSerializerにおける無効な文字の回避について

15753 PV

お世話になります。

当方、C#.netにより開発を行っています。
Xmlをデシリアライズする際に、XmlSerializerのDeserializeメソッドを使用しようとしていますが、XmlExceptionが以下の例外を返します。

・当該コード

 System.IO.FileStream fs = new System.IO.FileStream(file, System.IO.FileMode.Open);

 System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(WindowsFormsApplication2.model.issuesModel));

 WindowsFormsApplication2.model.issuesModel model = (WindowsFormsApplication2.model.issuesModel)serializer.Deserialize(fs);

・発生する例外のメッセージ

XMLドキュメント(4,35)でエラーが発生しました。

・当該のXML箇所

<issues total_count="***" offset="*" limit="**" type="****">
<issue>
<id>*****</id>
<project id="128" name="minName 【サンプル】あああああ"/>
                  ↑(4,35)はここです。

調査したところ以下の資料がありました。
・件名や本文などに無効な制御文字が含まれていると EWS でアイテムを取得する際に System.Xml.XmlException が発生する
https://support.microsoft.com/ja-jp/kb/2774517/ja

そこで、この資料と同様に、無効な文字(【】)を無視できるようにしたいと思っています。
何卒、ご教授頂ければと思います。
また、問題解決の方向性がそもそも間違っている場合にも、恐縮ですがご指摘いただければ幸いです。
よろしくお願いいたします。

回答

この質問は EWS関係なく Deserializeでエラーになると思っていいんでしょうか?

試しに以下の様なコードを作ってみましたがとくにエラーにはなりませんでした。

(Win8.1 x64, vs2013, target Framework 4.5.1)

namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args)
        {

            var file = Path.Combine(Path.GetTempPath(), "serial.xml");
            Console.WriteLine(file);


            XmlSerializer serializer = new XmlSerializer(typeof(List<Issue>));

            var issues = new List<Issue>();
            issues.Add(new Issue());

            using (var fs = new FileStream(file, FileMode.Create))
            {
                serializer.Serialize(fs, issues);
            }

            using (var fs = new FileStream(file, FileMode.Open)) {
                var p = (List<Issue>)serializer.Deserialize(fs);
                Console.WriteLine(p.First().project.name);
            }

            Console.ReadKey();
        }
    }

    public class Issue
    {
        public string id = "サンプル";
        public Project project = new Project();
    }

    public class Project
    {
        [XmlAttributeAttribute("id")]
        public int id = 128;

        [XmlAttributeAttribute("name")]
        public string name = "minName 【サンプル】あああああ";
    }
}

生成されるXMLは以下になります。

<?xml version="1.0"?>
<ArrayOfIssue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Issue>
    <id>サンプル</id>
    <project id="128" name="minName 【サンプル】あああああ" />
  </Issue>
</ArrayOfIssue>

もしXMLを手動で作っている場合は、エンコードが UTF-8になっているかを確認してみてください。

編集 履歴 (0)
  • ご回答ありがとうございます。Xmlファイルのエンコードを確認し、UTF-8にしたところ問題なく動作いたしました。
    ありがとうございました。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。