在C#中解析XML数据并显示到ListBox中

我正在尝试使用Visual Studio在C#中解析XML文件并在ListBox中显示数据,但是当我处理嵌套的XML文件时,我不知道如何解析它。

这是XML文件中的代码:

 <!DOCTYPE root [       ]>   true 30  false 32    

我用C#编写的代码成功地只返回了每个人的姓名,性别和年龄,但我不知道如何写信给我以及person_liked:

 private void LoadPersons() { XmlDocument doc = new XmlDocument(); doc.Load("Baza_de_cunostinte.xml"); foreach (XmlNode node in doc.DocumentElement) { string name = node.Attributes[0].Value; int age = int.Parse(node["Age"].InnerText); bool isMale = bool.Parse(node["IsMale"].InnerText); // Persons likedPerson.name = Persons.node.Attributes[0].Value ? // ..... listBox.Items.Add(new Persons(name, age, isMale, likedPerson)); } } private void listBox_SelectedIndexChanged(object sender, EventArgs e) { if (listBox.SelectedIndex != -1) { propertyGrid1.SelectedObject = listBox.SelectedItem; } } 

这是Persons.cs的定义:

 class Persons { public string Name { get; private set; } public int Age { get; private set; } public bool IsMale { get; private set; } public Persons LikedPerson { get; private set; } public Persons(string name, int age, bool isMale, Persons likedPerson) { Name = name; Age = age; IsMale = isMale; LikedPerson = likedPerson; } } 

 XmlSerializer mySerializer = new XmlSerializer(typeof(Persons)); // Create a FileStream or textreader to read the xml data. FileStream myFileStream = new FileStream("xmldatafile.xml", FileMode.Open); var person = (Persons) mySerializer.Deserialize(myFileStream); 

您还需要为Persons类添加没有参数的构造函数。

最自然的方法是按照建议使用XmlSerializer ,但要这样做,你必须稍微重构一下你的类:

 [XmlType(Namespace="", TypeName="root")] public class PersonCollection { [XmlElement(Namespace="", ElementName="Persons")] public List People { get; set; } } public class Persons { [XmlAttribute(AttributeName="name")] public string Name { get; set; } public int Age { get; set; } public bool IsMale { get; set; } public Persons LikedPerson { get; set; } public Persons() { } public Persons(string name, int age, bool isMale, Persons likedPerson) { Name = name; Age = age; IsMale = isMale; LikedPerson = likedPerson; } } 

然后你可以做这样的事情:

 XmlSerializer ser = new XmlSerializer(typeof(PersonCollection)); PersonCollection pc = (PersonCollection)ser.Deserialize(File.OpenRead("Baza_de_cunostinte.xml")); foreach (Persons p in pc.People) { // you now have a fully populated object } 

并且pc.People列表将包含您的Persons对象。

@ user3063909,

1-使用XSD进行XML定义。 例如:

                  

2- Persons类应如下所示:

 namespace StackOverflow { public class Root { [XmlElement("Persons")] public List Persons { get; set; } } public class Persons { public string IsMale { get; set; } public int Age { get; set; } public Persons LikedPerson { get; set; } [XmlAttribute("Name")] public string Name { get; set; } } } 

3-序列化程序类:

 namespace StackOverflow { public class XmlSerializerHelper where T : class { private readonly XmlSerializer _serializer; public XmlSerializerHelper() { _serializer = new XmlSerializer(typeof(T)); } public T BytesToObject(byte[] bytes) { using (var memoryStream = new MemoryStream(bytes)) { using (var reader = new XmlTextReader(memoryStream)) { return (T)_serializer.Deserialize(reader); } } } } } 

4-最后,这样称呼它:

 var fileBytes = File.ReadAllBytes("C:/xml.xml"); var persons = new XmlSerializerHelper().BytesToObject(fileBytes); 

结果将是具有人员列表的根类。

干杯。

你可以获得LikedPerson节点,并像现在一样得到它的名字/年龄。 为了避免代码重复,您可以创建一个方法,该方法接受XmlNode,递归地解析它并返回一个Person。 但更好的方法是使用XmlSerializer

 foreach (XmlNode node in doc.DocumentElement) { string name = node.Attributes[0].Value; int age = int.Parse(node["Age"].InnerText); bool isMale = bool.Parse(node["IsMale"].InnerText); var likedPerson = node.SelectSingleNode("LikedPerson"); if (likedPerson != null){ string name = likedPerson.Attributes[0].Value; //age, gender, etc. } }