2015-07-24 2 views
0

У меня есть код ниже, который проходит через XML-документ, чтобы захватить определенную информацию. Я хочу захватить 3 бита информации и поместить их в переменные. Поскольку код показывает, что я объявил переменные перед циклом, то после цикла я пытаюсь использовать переменные, которые упоминают, что они не назначены.Ошибка при попытке доступа к переменной внутри цикла for

Я также считаю, что 3 петли, вероятно, не лучший способ сделать это, но не смогли найти другой способ получить все три бита информации.

Heres код;

private void findDetails(String school) 
    { 
     XElement root = XElement.Load("proxies.xml"); 

     IEnumerable<XElement> proxydetails = from el in root.Elements("item") where (string)el.Element("schoolname") == school select el; 

     String SchoolAddress1, Port, Enabled = ""; 

     foreach (XElement el in proxydetails) 
     { 
      SchoolAddress1 = (string)el.Element("schooladdress");   
     } 
     foreach (XElement el in proxydetails) 
     { 
      Port = (string)el.Element("schoolport"); 

     } 
     foreach (XElement el in proxydetails) 
     { 
      Enabled = (string)el.Element("schoolenabled"); 

     } 

     MessageBox.Show(SchoolAddress1); 
     } 

Я только что проверил, какие данные возвращаются в proxydetails, и это следующее;

<item> 
<schoolname>Primary School</schoolname> 
<schooladdress>proxy</schooladdress> 
    <schoolport>80</schoolport> 
    <schoolenabled>1</schoolenabled> 
    </item> 

Вот обновленный код, который сейчас работает;

private void findDetails(String school) 
     { 
      XElement root = XElement.Load("proxies.xml"); 

      IEnumerable<XElement> ProxyDetails = from el in root.Elements("item") where (string)el.Element("schoolname") == school select el; 

      String schoolAddress1 = ""; 
      String port = ""; 
      String enabled = ""; 

      foreach (XElement el in ProxyDetails) 
      { 
       schoolAddress1 = (string)el.Element("schooladdress"); 
       port = (string)el.Element("schoolport"); 
       enabled = (string)el.Element("schoolenabled"); 
      } 


      MessageBox.Show(schoolAddress1); 
      } 
+1

Вы уверены, что proxydetails, имеющие данные ? + На самом деле вам не нужны 3 петли! – Neel

+1

Похоже, что у вас ничего нет в proxydetails, и петли вообще не происходят. Запустите его в режиме отладки и сообщите нам, что это счет элемента в перечислителе перед входом в первый цикл. – Gnqz

+0

Я только что добавил то, что содержалось в proxydetails. – Nathan

ответ

1

Линия:

String SchoolAddress1, Port, Enabled = ""; 

эквивалентно:

String SchoolAddress1; 
String Port; 
String Enabled = ""; 

Если вы хотите инициализировать их все, что вам нужно ему нравится:

String SchoolAddress1 = ""; 
String Port = ""; 
String Enabled = ""; 

как компилятор не может знаете ли, что proxydetails будет содержать что угодно, он не может знать, будет ли назначено SchoolAddress1 ed значение в цикле. Таким образом, он играет безопасно и предупреждает, что переменная может быть не определена в момент, когда вы пытаетесь ее прочитать.

+0

Это был ответ, я также изменил соглашения об именах переменных и методов, а также удалил избыточные циклы. чтобы помочь другим, я опубликую обновленный код. – Nathan

0

попытка ниже код: -

private void findDetails(string school) 
    { 
     var root = XElement.Load("proxies.xml"); 

     IEnumerable<XElement> proxydetails = from el in root.Elements("item") where (string)el.Element("schoolname") == school select el; 

     var schoolAddress1 = string.empty; 
     var port = string.empty; 
     var enabled = string.empty; 

     var result = proxydetails.Select(x => new { schoolAddress1 = x.schooladdress, port = x.schoolport, enabled = x.schoolenabled}).ToLost(); 

     MessageBox.Show(result[0].schoolAddress1); 
     } 

Поскольку в коде "" был присвоен только порт; + следовать правилам кода для лучшего программирования.

0

Init вы строка со значением String.Empty:

String SchoolAddress1, Port, Enabled = ""; 

должен быть

String SchoolAddress1 = string.Empty, Port = string.Empty, Enabled = string.Empty; 

Кроме того, слияние Еогеасп петли в один:

foreach (XElement el in proxydetails) 
{ 
    SchoolAddress1 = (string)el.Element("schooladdress"); 
    Port = (string)el.Element("schoolport");  
    Enabled = (string)el.Element("schoolenabled"); 
} 
Смежные вопросы