0

さまざまなマシンからXMLファイルを読み取ろうとしていますが、これらのファイルの一部には、他のファイルにはないデータ要素が含まれている可能性があります。現在、私はこれらの状況を処理するためにTry-Catchブロックを使用していますが、これを行うためのより良い方法があるかどうか疑問に思っていました、何か考えはありますか?

XmlDataDocument xmlDatadoc = new XmlDataDocument();
xmlDatadoc.DataSet.ReadXml("MachineData.xml");

   DataSet ds = new DataSet("AppData");
   ds = xmlDatadoc.DataSet;

   DataView dv = new DataView(ds.Tables[config.GlobalVars.Paths]);
   foreach (DataRowView drv in dv)
   {
      try
      {
         cApp.TransferProtcol = drv["TransferProtocol"].ToString();
      }
      catch { }

      try
      {
         cApp.RemoteServerPath = drv["RemoteServer"].ToString();
      }
      catch { }
   }

わかりました。JohnSaundersの投稿に基づいて解決策を見つけました。

     if(ds.Tables[0].Columns.Contains("TransferProtocol")
     {
          try
          {
             if (drv["TransferProtocol"].ToString().Length > 0)
             {
                 cApp.TransferProtcol = drv["TransferProtocol"].ToString();
             }
          }
          catch(Exception e)
          {
             Messagebox.Show(e.Message);
          }
     }

空のCatchブロックについては同意しますが、テスト目的でそれらをスタブしました。それ以来、Try-Catchブロックが現在どのように見えるかについて投稿を編集しました。

4

2 に答える 2

3

それは問題を「処理」するための恐ろしい方法です。XML に正当な理由で要素が欠落している可能性がある場合は、要素にアクセスする前に要素が存在するかどうかを確認してください。

空の catch ブロックは、要素が欠落していることを意味する例外だけでなく、内部で発生するすべての例外を無視します。


テーブルがロードされるとすぐに、列が存在するかどうか。ds.Tables[config.GlobalVars.Paths].Columns.Contains("columnName")列が存在するかどうかを判断するために使用できます。

列が存在する場合、任意の行について、その列が null である場合とそうでない場合があります。drv.Row.IsNull("columnName")その行のその列が null かどうかを判断するために使用します。

于 2011-09-25T15:44:52.567 に答える
0

わかりました、XmlDataDocument が間もなく非推奨になることに気付いたので、それをスクレイピングして Linq to XML を使用することにしました。これが私の新しい解決策です。

public List<cApplication> GetAppSettings()
        {
            if (!File.Exists(Config.System.XMLFilePath))
            {
                WriteXMLFile();
            }

            try
            {
                XDocument data = XDocument.Load(Config.System.XMLFilePath);

                return (from c in data.Descendants("Application")
                        orderby c.Attribute("Name")
                        select new cApplication()
                        {
                            LocalVersion = (c!=null)?c.Element("Version").Value:string.Empty,
                            RemoteVersion = (c!=null)?c.Element("RemoteVersion").Value:string.Empty,
                            DisableApp = (c!=null)?((YesNo)Enum.Parse(typeof(YesNo), c.Element("DisableApplication").Value, true)):YesNo.No,
                            SuspressMessages = (c != null) ? ((YesNo)Enum.Parse(typeof(YesNo), c.Element("SuspressMessage").Value, true)):YesNo.No
                        }).ToList();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                List<cApplication> l = new List<cApplication>().ToList();
                return l.ToList();
            }
        }
于 2011-09-26T20:52:24.237 に答える