C#中XML文件的读写操作

先上要解析的xml文件:(我这边的xml名为config.xml,也请不要纠结这些标签的含义,就这么个意思)

<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?>
<root>
	<rule name="许继" offset="1">
		<mapping>
			<ori>1</ori>
			<des>2</des>
		</mapping>
		<mapping>
			<ori>2</ori>
			<des>3</des>
		</mapping>
		<mapping>
			<ori>3</ori>
			<des>4</des>
		</mapping>
		<mapping>
			<ori>5</ori>
			<des>6</des>
		</mapping>
	</rule>
	<rule name="扎窝" offset="2">
		<mapping>
			<ori>1</ori>
			<des>2</des>
		</mapping>
		<mapping>
			<ori>2</ori>
			<des>3</des>
		</mapping>
		<mapping>
			<ori>3</ori>
			<des>4</des>
		</mapping>
	</rule>
</root>
</span>

本例中要求此xml文件要放在跟exe文件同级目录下面,也就是Debug目录下面。

分析此xml文件,要读取此文件,并把所有内容都保存到内存中,则需要设计一个类,因此在控制台项目中添加一个新类,名为RuleClass,里面的结果跟xml相对应,是三个属性,分别是string name,int offset,和List<Hashtable> ruleList类型。注意,我这边将每一个mapping标签设计成了一个Hashtable类型,然后这里就必须用一根list去装那么多的Hashtable对象了,其实可以设计为一个hashtable对象,这个自己去考虑,可以根据需求自己去修改。

类源码如下:

<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections; 

namespace ConsoleApplication3
{
    class RuleClass
    {
        private List<Hashtable> ruleList;

        public List<Hashtable> RuleList
        {
            get { return ruleList; }
            set { ruleList = value; }
        }
        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }
}
</span>
上面这个类,我自己画了个类结构示意图,如下(可能不标准,仅供参考)


完了之后,就是写解析的方法了,没什么难点,就是一点,分析清楚结构层次,不要搞混淆了,所以就直接上代码了:

<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Xml;

namespace ConsoleApplication3
{
    class Program
    {
        
        static void Main(string[] args)
        {
            List<RuleClass> ruleClassList = null;
            ruleClassList = new List<RuleClass>();
            RuleClass ruleClass = null;
            
            Hashtable ruleTable = null;
            List<Hashtable> mappingList;


            XmlDocument document = new XmlDocument();
            document.Load("config.xml");
            //获得根节点
            XmlElement rootElem = document.DocumentElement;
            XmlNodeList ruleNodes = rootElem.GetElementsByTagName("rule");
            foreach (XmlNode node in ruleNodes)
            {
                ruleClass = new RuleClass();
                mappingList = new List<Hashtable>();

                string strName = ((XmlElement)node).GetAttribute("name");
                int offset = Convert.ToInt32(((XmlElement)node).GetAttribute("offset"));
                Console.WriteLine("name: "+strName+" offset: "+offset);
                ruleClass.Name = strName;
                ruleClass.Offset = offset; 
                XmlNodeList mappingNodes = ((XmlElement)node).GetElementsByTagName("mapping");
                foreach (XmlNode subNode in mappingNodes)
                {

                    XmlNodeList nls = ((XmlElement)subNode).ChildNodes; 
                    string key = "";
                    string value = "";
                    foreach (XmlNode xn1 in nls)//遍历
                    {
                        ruleTable = new Hashtable();

                        XmlElement xe2 = (XmlElement)xn1;//转换类型
                        if (xe2.Name == "ori")//如果找到
                        {
                            //         Console.WriteLine(xe2.InnerText);
                            key = xe2.InnerText;
                        }
                        if (xe2.Name == "des")//如果找到
                        {
                            //          Console.WriteLine(xe2.InnerText);
                            value = xe2.InnerText;
                        }
                        ruleTable.Add(key, value);
                    }
                    mappingList.Add(ruleTable);
                }
                ruleClass.RuleList = mappingList;
                ruleClassList.Add(ruleClass);
            }

            foreach (Hashtable table in ruleClassList[0].RuleList)
            {
                foreach (DictionaryEntry de in table)
                {
                    int key = Convert.ToInt32(de.Key);
                    int value = Convert.ToInt32(de.Value);
                    Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value);
                  
                }
            }

        }
    }
}
</span>

最后输出的结果如下:(这里只输出了列表中的第一个对象)


















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值