Отсутствующие элементы XML в файле XML - PullRequest
0 голосов
/ 25 сентября 2011

Я пытаюсь читать 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 { }
   }

Хорошо, я нашел решение, основанное на сообщении Джона Сондерса:

     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.

Ответы [ 2 ]

2 голосов
/ 25 сентября 2011

Это ужасный способ «справиться» с проблемой.Если в XML вполне законно могут отсутствовать элементы, проверьте, присутствуют ли эти элементы, прежде чем пытаться получить к ним доступ.

Ваши пустые блоки catch игнорируют все исключения, возникающие внутри них, а нетолько исключения, которые означают, что элемент отсутствует.


Столбцы присутствуют или нет, как только таблица загружена.Вы можете использовать ds.Tables[config.GlobalVars.Paths].Columns.Contains("columnName"), чтобы определить, существует ли столбец.

Если столбец существует, то для любой данной строки столбец может быть или не быть пустым.Используйте drv.Row.IsNull("columnName"), чтобы определить, является ли этот столбец в этой строке нулевым.

0 голосов
/ 27 сентября 2011

Хорошо, я только что заметил, что 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();
            }
        }
...