2013-12-10 2 views
0

Я ниже C# код и я получаю текущий индекс находится вне диапазона Погрешностьтекущий индекс находится вне диапазона C#

public partial class FrmTreeViewContinents : Form 
{ 
    // Objets communs 
    XmlDocument monXml = new XmlDocument(); 
    XmlNodeList listeNode = null; 
    XmlNode root = null; 

    public FrmTreeViewContinents() 
    { 
     InitializeComponent(); 
    } 

    private void btnTransferToXml_Click(object sender, EventArgs e) 
    { 
     ManipXml obj = new ManipXml(); 

     // Sérialise une collection d'objets 'Pays' en fichier XML 
     obj.SerialiseObjets("Pays.xml"); 
    } 

    private void btnAfficheEntity_Click(object sender, EventArgs e) 
    { 
     // Chargement du fichier XML - Abandon si erreur 
     if (!ChargeFichierXml()) return; 
     // Sélecton des données dans le noeud XML 'Pays' 
     listeNode = root.SelectNodes("//Pays"); 
     // Affichage des données lues 
     AffichageDonnees(); 
    } 

    // Méthode d'affichage des données lues dans le fichier XML 
    private void AffichageDonnees() 
    { 
     txtBoxAffiche.Clear(); 
     foreach (XmlNode noeud in listeNode) 
     { 
      txtBoxAffiche.Text += noeud.Attributes[2].InnerText.ToString() + 
       " - " + 
       noeud.Attributes[3].InnerText.ToString() + 
       " - " + 
       noeud.Attributes[4].InnerText.ToString() + 
       Environment.NewLine; 
     } 
    } 

    // Méthode de chargement du fichier XML 
    private bool ChargeFichierXml() 
    { 
     try 
     { 
      monXml.Load("Pays.xml"); 
     } 

     catch (Exception ex) 
     { 
     MessageBox.Show("Erreur sur chargement du fichier XML" 
     + Environment.NewLine + ex.Message, 
       "Erreur", 
       MessageBoxButtons.OK, 
       MessageBoxIcon.Error); 
      return false; 
     } 

     //XmlNodeList listeNode; 
     root = monXml.DocumentElement; 
     return true; 
    } 
    } 

    class ManipXml 
    { 
    // Cette méthode permet de générer un fichier XML avec une collection de 'Pays' 
    public void SerialiseObjets(string sNomFichierXml) 
    { 
     XmlSerializer xmlSerializer = new XmlSerializer(typeof(Collection<Pays>)); 

     Collection<Pays> colPays = new Collection<Pays>(); 

     Pays cnt1 = new Pays(); 
     cnt1.NomPays = "Australie"; 
     cnt1.NomCapitalePays = "Canberra"; 
     cnt1.NomContinent = "Australie"; 

     Pays cnt2 = new Pays(); 

     cnt2.NomPays = "France"; 
     cnt2.NomCapitalePays = "Paris"; 
     cnt2.NomContinent = "Europe"; 

     Pays cnt3 = new Pays(); 

     cnt3.NomPays = "Espagne"; 
     cnt3.NomCapitalePays = "Madrid"; 
     cnt3.NomContinent = "Europe"; 

     Pays cnt4 = new Pays(); 

     cnt4.NomPays = "Chine"; 
     cnt4.NomCapitalePays = "Beijing"; 
     cnt4.NomContinent = "Asie"; 

     Pays cnt5 = new Pays(); 

     cnt5.NomPays = "Malaysia"; 
     cnt5.NomCapitalePays = "Kuala-Lumpur"; 
     cnt5.NomContinent = "Asie"; 

     // Ajout des 'Continent' dans la collection 
     colPays.Add(cnt1); 
     colPays.Add(cnt2); 
     colPays.Add(cnt3); 
     colPays.Add(cnt4); 
     colPays.Add(cnt5); 

     // Instanciation d'un Stream 
     Stream st = new FileStream(sNomFichierXml, FileMode.Create); 
     // Génération du fichier XML 
     xmlSerializer.Serialize(st, colPays); 
     st.Close(); 
    } 
    } 
    public class Pays // Définition de la classe Continent 
    { 
    public string NomPays { get; set; } 
    public string NomCapitalePays { get; set; } 
    public string NomContinent { get; set; } 
    } 

ошибка я получил в разделе ниже, что "текущий индекс находится вне диапазона"

foreach (XmlNode noeud in listeNode){ 

txtBoxAffiche.Text += noeud.Attributes[2].InnerText.ToString() +" - " 
+ noeud.Attributes[3].InnerText.ToString() + " - " 
+ noeud.Attributes[4].InnerText.ToString() + 
     Environment.NewLine; 
} 

пожалуйста, вы можете помочь мне

спасибо

+0

Ваш xml-файл 'Pays.xml' не имеет 5-го атрибута. –

+0

Отлаживайте и проверяйте свою ноту. Вы получаете XmlNode, у которого нет таких атрибутов. – Tobberoth

ответ

0

Проблема: Возможно, вы имеете доступ к атрибутам invalid файла Pays.xml.
Решение: Перед доступом к Атрибутам файла Pays.xml необходимо проверить свойство Attributes.Count.

Попробуйте:

foreach (XmlNode noeud in listeNode) 
{ 

for(int i=2;i<noeud.Attributes.Count;i++) 
{ 

if(i!=noeud.Attributes.Count-1) 
    txtBoxAffiche.Text += noeud.Attributes[i].InnerText.ToString() +" - "; 
else 
    txtBoxAffiche.Text += noeud.Attributes[i].InnerText.ToString() + Environment.NewLine; 
} 


} 
0

ошибка происходит из-за вас с использованием индекса вне диапазона.

например, если размер массива 3, но если вы попытаетесь получить доступ к 4-му индексу, он даст ошибку.

пожалуйста, проверьте эту часть для значения индекса

foreach (XmlNode noeud in listeNode){ 

txtBoxAffiche.Text += noeud.Attributes[2].InnerText.ToString() +" - " 
+ noeud.Attributes[3].InnerText.ToString() + " - " 
+ noeud.Attributes[4].InnerText.ToString() + 
     Environment.NewLine; 
} 
0

Проблема заключается в одном из атрибутов [] индекс. Вы получаете позиции 2, 3 и 4, и я уверен, что у вас нет таких атрибутов (4, 3 или 2).

Прежде чем использовать их, вы можете установить эти значения перед некоторыми переменными.

string attribute2 = noeud.Attributes[2].InnerText.ToString(); 
string attribute3 = noeud.Attributes[3].InnerText.ToString(); 
string attribute4 = noeud.Attributes[4].InnerText.ToString(); 

Но это не очень хорошая практика ... Сначала проверьте, существует ли атрибут.

string attribute2; 
if (noeud.Attributes[2] != null) { 
    attribute2 = noeud.Attributes[2].InnerText.ToString(); 
} 
Смежные вопросы