это мой 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();
теперь он не дает никаких ошибок и не отображает содержимое списка
Попробуйте использовать свойство 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);
}
}
Count
...
for
:for (int i = 0; i < XmlData.addressList.Length; i++)