c#将xml格式文档解析成实体类

c#—XML信息读取(将XML格式解析存放到实体类中)

本人菜鸟一个,闲来无事,记录工作所用,解释如有偏差错误,欢迎指正!
准备工作:
使用XmlDocument,需要添加引用:System.Xml.XmlDocument
个人见解:
对于解析Xml文档,我们可以看做是一个一个的对象组成,将根节点看做是一个最大的对象,它的属性就是这个对象的字段,如果它有子节点的话,就可以考虑创建一个列表来存储它的子节点,把这些子节点再看做是一个一个的对象,以此类推,属性看做是字段,子节点看做是对象,存储到父节点的列表中。
主要方法:
Load()和LoadXml()
简单解释
1、XmlDocument:
初始化 System.Xml.XmlDocument 类的新实例。
// XmlDocment专门用来解析xml文档的
XmlDocument xmlDoc = new XmlDocument();
2、Load()/LoadXml():
xmlDoc.Load(“skillinfo.txt”);//第一种:选择要加载解析的xml文档的名字
xmlDoc.LoadXml(File.ReadAllText(“skillinfo.txt”));//第二种:传递一个字符串(xml格式的字符串)
3、XmlNode:
表示 XML 文档中的单个节点。
//得到根结点 (xmlnode用来代表一个结点)
XmlNode rootNode = xmlDoc.FirstChild;//获取第一个结点,Xml文档的第一个子节点即根节点
4、XmlNode.Name
获取XmlNode的name名称
5、XmlNode.InnerText
获取或设置节点及其所有子节点的串连值即XmlNode的值
返回结果:
节点及其所有子节点的串连值。
6、XmlNodeList:
表示节点的有序集合。
//得到根结点下面的子节点的有序集合,
XmlNodeList skillNodeList = rootNode.ChildNodes;//获取当前结点下面的所有子节点
7、ChildNodes:
public virtual XmlNodeList ChildNodes { get; },返回值是一个XmlNodeList的集合
XmlNodeList skillNodeList = rootNode.ChildNodes;
获取节点的所有子节点。
返回结果: 一个包含节点的所有子节点的对象。 如果不含有任何子节点,此属性返回一个空 System.Xml.XmlNodeList。
8、Attributes:
public virtual XmlAttributeCollection Attributes { get; }返回值为XmlAttributeCollection类型的一个集合
// 获取 System.Xml.XmlAttributeCollection 包含此节点的属性。
返回结果:
// XmlAttributeCollection 包含节点的属性。 如果节点为 XmlNodeType.Element 类型,则返回该节点的属性。 否则,此属性将返回null。
9、XmlAttributeCollection:
获取具有指定索引的属性。
10、public XmlAttribute this[int i] { get; }
获取具有指定名称的属性。
// 参数:
//name:
//属性的限定名称。
// 返回结果:
//具有指定名称的 System.Xml.XmlAttribute。 如果该属性不存在,此属性返回 null。
Eg:
skill.Lang = fieldNode.Attributes[0].Value;
11、public XmlAttribute this[string name] { get; }
获取具有指定的本地名称和命名空间统一资源标识符 (URI) 的属性。
// 参数:
//localName:
//属性的本地名称。
//namespaceURI:
//属性的命名空间 URI。
// 返回结果:
//System.Xml.XmlAttribute 具有指定的本地名称和命名空间 URI。 如果该属性不存在,此属性返回 null。
Eg:
playerstaQuarter.ReciveFouls = Int32.Parse(col[“ReciveFouls”].Value);
12、Attribute.Value
//获取或设置节点的值。
// 返回结果:
//返回的值取决于节点的 System.Xml.XmlNode.NodeType。 有关 XmlAttribute 节点,此属性是属性的值。
// 异常:
//T:System.ArgumentException:
//该节点是只读的而 set 操作称为

简单案例

以对象为切入点,一层套一层建立起联系,方便后续调用获取

Xml格式:

<a>
	<ID>1</ID>
	<Name>jack</Name>
	<Address>
		<Province>浙江</Province>
		<City>
			<Name>杭州</Name>
			<Code>310000</Code>
		</City>
	</Address>
	<Hobby>
		<Category>运动</Category>
		<Name>篮球</Name>
	</Hobby>
	<Hobby>
		<Category>音乐</Category>
		<Name>小提琴</Name>
	</Hobby>
</a>

C#实体类代码:

public class a
{
	public int ID { get; set; }  
    public string Name { get; set; }  
    public Address Address { get; set; }  
    public List<Hobby> Hobbies { get; set; } 
}
public class Address
{
	public string Province { get; set; }
	public City City { get; set; }
}
public class City
{
	public string Name { get; set; }
	public string Code { get; set; }
}
public class Hobby
{
	public string Category { get; set; }
	public string Name { get; set; }
}

创建LoadXml()方法读取xml数据,存放到实体类

public void LoadXml()
{
	XmlDocument xmlDoc = new XmlDocument();
	//取到xml数据
    xmlDoc.Load("Demo.xml");//这是一个demo文件,需要将它放到项目中,然后设置如果较新则复制
	//然后根据节点获取对应的值,并且存放到对应的实体类中
	XmlNode aNodeNode = xmlDoc.FirstChild;//获取到第一个子节点,也就是节点a
}
public a LoadXml(string xml)  
{  
    XmlDocument doc = new XmlDocument();  
    doc.LoadXml(xml);  
  
    // 创建实体类实例  
    a entity = new a();  
  
    // 获取根节点下的子节点  
    XmlNodeList nodes = doc.DocumentElement.ChildNodes;  
  
    // 遍历子节点,并给实体类属性赋值  
    foreach (XmlNode node in nodes)  
    {  
        switch (node.Name)  
        {  
            case "ID":  
                entity.ID = int.Parse(node.InnerText);  
                break;  
            case "Name":  
                entity.Name = node.InnerText;  
                break;  
            case "Address":  
                entity.Address = new Address();  
                XmlNode addressNode = node.SelectSingleNode("Province");  
                if (addressNode != null) entity.Address.Province = addressNode.InnerText;  
  
                addressNode = node.SelectSingleNode("City/Name");  
                if (addressNode != null) entity.Address.City = new City { Name = addressNode.InnerText };  
                addressNode = node.SelectSingleNode("City/Code");  
                if (addressNode != null) entity.Address.City.Code = addressNode.InnerText;  
                break;  
            case "Hobby":  
                Hobby hobby = new Hobby();  
                hobby.Category = node.SelectSingleNode("Category").InnerText;  
                hobby.Name = node.SelectSingleNode("Name").InnerText;  
                if (entity.Hobbies == null) entity.Hobbies = new List<Hobby>();  
                entity.Hobbies.Add(hobby);  
                break;  
        }  
    }  
    return entity;  
}

在这个方法中,我们首先创建一个XmlDocument对象,并使用LoadXml()方法将XML字符串加载到该对象中。然后,我们创建一个实体类a的实例。接下来,我们获取根节点下的所有子节点,并遍历这些节点。对于每个节点,我们检查其名称,并根据其名称将其值设置到实体类的相应属性中。对于Address和Hobby节点,我们创建一个新的Address或Hobby实例,并设置其属性。最后,我们返回实体类实例。

你可能感兴趣的:(c#,xml)