Доступ к данным из списка C #, который хранит десериализованный XML

1

это мой Xml файл, который я пытаюсь desirialize:

<?xml version="1.0"?>
<AddressDirectory>
  <Address>
    <HouseNo>1</HouseNo>
    <StreetName>Pitampura</StreetName>
    <City>Delhi</City>
  </Address>
  <Address>
    <HouseNo>4</HouseNo>
    <StreetName>Rohini</StreetName>
    <City>Delhi</City>
  </Address>
</AddressDirectory>

это мои классы:

public class AddressDirectory
{
    [XmlElement("Address")] 
    public List<Address> addressList = new List<Address>(); 
}
public class Address
{
    public int HouseNo { get; set; }
    public string StreetName { get; set; }
    public string City { get; set; }
}

это мое главное:

XmlSerializer deserializer = new XmlSerializer(typeof(AddressDirectory));
TextReader reader = new StreamReader(@"D:\myXml.xml");
object obj = deserializer.Deserialize(reader);
AddressDirectory XmlData = (AddressDirectory)obj;
reader.Close();

так я получаю доступ к элементам, которые должны быть сохранены в списке:

XmlData.addressList[0].HouseNo;
XmlData.addressList[0].StreetName; 
XmlData.addressList[0].City;

или в цикле я получаю следующее:

for (int i = 1; i < 10; i++)
            {
                Console.Write("house number for {0}: ", i);
                Console.WriteLine(XmlData.addressList[i].HouseNo);
                Console.Write("Street Name  for {0}: ", i);
                Console.WriteLine(XmlData.addressList[i].StreetName);
                Console.Write("City         for {0}: ", i);
                Console.WriteLine(XmlData.addressList[i].City);
            }

это ошибка, которую я получаю при выполнении программы:

Индекс был вне пределов досягаемости. Должен быть неотрицательным и меньше размера коллекции.

Думаю, это потому, что мы ничего не добавляем в список. Поскольку для добавления в список мы должны использовать List.Add() где-то в основном.

это моя главная() после редактирования:

XmlSerializer deserializer = new XmlSerializer(typeof(AddressDirectory));
            TextReader reader = new StreamReader(@"D:\addressDirectory.xml");
            object obj = deserializer.Deserialize(reader);
            AddressDirectory XmlData = (AddressDirectory)obj;
            reader.Close();


            for (int i = 0; i < XmlData.addressList.Count; i++)
            {
                Console.WriteLine("Information for item #{0}", i + 1);
                Console.WriteLine(" - House Number ... {0}", XmlData.addressList[i].HouseNo);
                Console.WriteLine(" - Street Name .... {0}", XmlData.addressList[i].StreetName);
                Console.WriteLine(" - City ........... {0}", XmlData.addressList[i].City);
            }
            Console.ReadLine();

теперь он не дает никаких ошибок и не отображает содержимое списка

  • 1
    Вероятно, вам следует использовать границы addressList для вашего условия for : for (int i = 0; i < XmlData.addressList.Length; i++)
  • 0
    for (int i = 1; i <10; i ++) - у вас нет 10 элементов, поэтому вы не можете получить доступ к XmlData.addressList [9], потому что он не существует
Теги:
serialization
xml-deserialization

1 ответ

1

Попробуйте использовать свойство XmlData.addressList.Count для вашего условия:

for (int i = 0; i < XmlData.addressList.Count; i++)
{
    Console.WriteLine("Information for item #{0}", i + 1);
    Console.WriteLine(" - House Number ... {0}", XmlData.addressList[i].HouseNo);
    Console.WriteLine(" - Street Name .... {0}", XmlData.addressList[i].StreetName);
    Console.WriteLine(" - City ........... {0}\n", XmlData.addressList[i].City);
}

Вот еще один способ сделать это, наряду с остальной частью кода, который я использовал для тестирования (который работал с вашим файлом и классами xml):

public static void Main()
{        
    var addresses = new List<Address>();
    var deserializer = new XmlSerializer(typeof(AddressDirectory));
    using (var reader = new StreamReader(@"C:\Users\Rufus\Documents\temp\temp.xml"))
    {
        addresses.AddRange(
            ((AddressDirectory)deserializer.Deserialize(reader)).addressList);
    }

    int counter = 1;
    foreach (var address in addresses)
    {
        Console.WriteLine("Information for item #{0}", counter++);
        Console.WriteLine(" - House Number ... {0}", address.HouseNo);
        Console.WriteLine(" - Street Name .... {0}", address.StreetName);
        Console.WriteLine(" - City ........... {0}\n", address.City);
    }
}
  • 0
    Ошибка 1 «System.Collections.Generic.List <XmlDeserializer.AddressDetails>» не содержит определения для «Length» и отсутствует метод расширения «Length», принимающий первый аргумент типа «System.Collections.Generic.List <XmlDeserializer.AddressDetails > 'может быть найдено (вам не хватает директивы using или ссылки на сборку?) c: \ users \ ahsan \ documents \ visual studio 2012 \ Projects \ XmlDeserializer \ XmlDeserializer \ Program.cs 64 53 XmlDeserializer
  • 0
    Ой, прости, думал, что это массив. Попробуйте Count ...
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню