在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
上述就是C#学习教程:在C#中解析XML数据并显示到ListBox中分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
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. } }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1281715.html