0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[スキーマチェックに関する質問]xsdによってxmlを検証し、複数エラーメッセージを返却値として受け取りたい

Last updated at Posted at 2020-04-30

はじめに

初めまして、エンジニア歴1年目で最近C#を触り始めたものです。
早速ですが、1週間ほど悩んで解決できないことがあるので質問させていただきます。

使用環境及び言語

Microsoft Visual Studio 2019でC#を使用しております。

実現したいこと

実現したいこととしましては下記になります。

1.xsdによるxmlの検証(これはおそらくできている)
2.エラーが出た場合、エラーメッセージをArrayList型に設定し、返却値として渡す(すべてのエラーを設定したい)

現在の状況

xsdによってxmlを検証し、コンソールにエラーメッセージを出すところまでは調べれば出てきたのですが、
・複数のエラーが起きた時に最初のエラーのみが表示される点
・実際にはコンソールに表示するのではなく、エラーメッセージをArrayList型に設定し返却値とする点
以上の二点が現在実装できていない状況です。

以下、現在のソースコードです。(xmlファイル、xsdファイルについては適当なものをローカルに保存し、ファイルパスを渡しています)



        private ArrayList xmlCheck(string xmlFilePath, string xsdFilePath)
        {
            //xsdファイルパスから型変換
            XmlTextReader reader = new XmlTextReader(xsdFilePath);
            XmlSchema xmlschema = XmlSchema.Read(reader, ValidationCallback);
            XmlSchemaSet schemaSet = new XmlSchemaSet();
            schemaSet.Add(xmlschema);

            // XMLファイルとXSDファイルを設定する。
            XmlDocument xmlDocument = new XmlDocument();
            xmlDocument.Schemas.Add(schemaSet);
            xmlDocument.Load(xmlFilePath);
            try{
                //スキーマチェック
                xmlDocument.Validate(ValidationEventHandler);
                
                //仮の返却値
                return null;
            
            //xsd等の規約に対する例外?(そもそも必要?)
            }catch(XmlSchemaValidationException ex)
            {
                 //エラーあり(true)を返却
                return ex;
            }
        }

        private void ValidationCallback(object sender, ValidationEventArgs e)
            {
                switch (e.Severity)
                {
                    case XmlSeverityType.Error:
                        Console.WriteLine("Error:" + e.Message);
                        break;
                    case XmlSeverityType.Warning:
                        Console.WriteLine("Warning:" + e.Message);
                        break;
                }
            }

        private void ValidationEventHandler(object sender, ValidationEventArgs e)
            {
                switch(e.Severity)
                {
                    case XmlSeverityType.Error:
                        //errorInfoList.Add(e.Message);

                        Console.WriteLine("Error:" + e.Message);
                        break;
                    case XmlSeverityType.Warning:
                        Console.WriteLine("Warning:" + e.Message);
                        break;
                }                   
            }

終わりに

以上が私の質問になります。解答だけでなく分かりにくい点や、もっと情報が欲しい場合等も対応したいと思うので、そういった指摘でもございましたら是非よろしくお願いします。

2020/07/01追記 上記解決しました コード自体は問題なくイベントハンドラの理解不足でListに格納する度に初期化してました

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?