先上要解析的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>
最后输出的结果如下:(这里只输出了列表中的第一个对象)