老师让我们做一个用c#读取xml的实验。xml里放的是一条条的规则(RuleID号就是规则的编号,RuleID=null表示父节点不能表达一条规则,需要和子节点甚至孙节点,重孙节点一起去表达)
现在就是需要按照RuleID去读取xml,然后去刷excel里的样本集,样本集是在excel里一行一行的存储,读取也容易。现在关键就是不知道怎么读取xml。求猿神们帮忙指点迷津~`~`~~`~``~不甚感激!!!!!!!
<?xml version="1.0" encoding="utf-8" ?> <RuleSet> <Rank level="4" type="ABFIR,ABFIr,ABIRf,BFIRa,BFIar,FIabr,Fabir,Iabfr" class="gongye" ruleID="1"/> <Rank level="4" type="ABFRi,ABRfi,AFIRb,AFRbi,ARbfi,BFRai,BIRaf,BRafi,FRabi,IRabf,Rabfi" class="zhuzhai" ruleID="2"/> <Rank level="4" type="ABFir" class="null" ruleID="null"> <Rank level="10" type="ABFIR,..." class="gengdi" ruleID="3"/> <Rank level="10" type="ABIfr" class="zhuzhai" ruleID="4"/> <Rank level="10" type="AFbir" class="gengdi" ruleID="5"/> <Rank level="10" type="BFIar" class="luodi" ruleID="6"/> <Rank level="10" type="Fabir,abfir" class="gongye" ruleID="7"/> </Rank> <Rank level="4" type="ABIfr" class="null" ruleID="null"> <Rank level="9" type="ABFIR,ABFIr,ABFir,ABIfr,ABfir,AFIRb,AFIbr,AIRbf,AIbfr,Abfir,BFIRa,BFIar,BFRai,BFair,BIRaf,BIafr,BRafi,Bafir,FIRab,FIabr,Fabir,IRabf,Rabfi" class="zhuzhai" ruleID="8"/> <Rank level="9" type="AFbir" class="luodi" ruleID="9"/> <Rank level="9" type="Iabfr" class="nongcun" ruleID="10"/> <Rank level="9" type="abfir" class="zhuzhai" ruleID="11"/> </Rank> </RuleSet>
这类问题,一般通过 “C# 读取 XML 文件"等关键字就可以找到答案。学会使用baidu google 解决问题,是学习编程的第一步。祝你早日能够学会使用搜索引擎。
关键是我的xml很特别,父节点和子节点们共同决定一条规则,而我要提取xml文档里的所有规则,我需要一个思路。
用XDocument 去这里查看详细文档:http://msdn.microsoft.com/zh-cn/library/vstudio/system.xml.linq.xdocument.aspx
XDocument doc = XDocument.Load("x1.xml"); //加载xml 剩下的你看完msdn文档,应该就会用了
XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlPath); //取根结点 var root = xmlDoc.DocumentElement;//取到根结点 //取指定的单个结点 XmlNode oldChild = xmlDoc.SelectSingleNode("RuleSet/Rank"); //取指定的结点的集合 XmlNodeList nodes = xmlDoc.SelectNodes("RuleSet/Rank"); //上面已经取到了结点,取结点的属性就很简单了,如果集合就遍历就行了 //剩下的自己动手吧,自己做了才会熟悉的
我有写一篇关于C#操作XML的文章会有更多的介绍,LZ可以看看啊~
http://www.cnblogs.com/zery/p/3362480.html
你红色部份指的 “表达” 不知道说明什么
思路可以这样:
首先你把XML读进来 转化成 相应 Rank(自己定义,按你的XML,它是可以包含自身集合的) 对象集合
然后通过LINQ 操作 对象集合 得到你想要的数据
师兄你难得关注我红色的部分,红色部分的意思是,就拿下面的xml打比方:Rank level="4"不能表达一条规则,需要和其子节点Rank level=“10”一起表示一条规则。下面的xml代码就表示了5条规则,他们都是由Rank level="4"和Rank level=“10”共同表达的。大概就是这个意思。
<Rank level="4" type="ABFir" class="null" ruleID="null"> <Rank level="10" type="ABFIR,..." class="gengdi" ruleID="3"/> <Rank level="10" type="ABIfr" class="zhuzhai" ruleID="4"/> <Rank level="10" type="AFbir" class="gengdi" ruleID="5"/> <Rank level="10" type="BFIar" class="luodi" ruleID="6"/> <Rank level="10" type="Fabir,abfir" class="gongye" ruleID="7"/> </Rank>
如果我理解没错的话,读取xml应该是按顺序刷进去的,现在关键是要把读取进去的东西按照RuleID从小到大的顺序写进dataset使用,这块是我不能解决的,不知道你明白没有。
@whutGISer:看看items是不是你要的结果
//fullname 是 XML文件的全路径 XDocument xdoc = XDocument.Parse(File.ReadAllText(fullname)); var ranks = from c in xdoc.Descendants("Rank") where c.Parent.Name == "RuleSet" select c; var list = ranks.Where(n => n.Attribute("ruleID").Value != "null").Select(rank=>rank).ToList(); list.AddRange(ranks.Where(n => n.Attribute("ruleID").Value == "null").Select(rank => rank).Descendants().ToList()); var items = list.Select(n => new { level = int.Parse(n.Attribute("level").Value) , type = n.Attribute("type").Value, className = n.Attribute("class").Value, ruleID = n.Attribute("ruleID").Value, }).OrderBy(n => int.Parse(n.ruleID));
看你的XML里面的格式,我觉得完全就没必要这么做,因为ruleID是唯一的!1--11,根据ruleID就可决定规则了,对ID敏感一点,数据类的都是主键,一看到就先判断是不是唯一
用xml的序列化
先定义类
public class RuleSet
{
[XmlElement("Rank")]
public List<Rank> RuleList { get; set; }
}
public class Rank
{
[XmlAttribute("ruleID")]
public string ruleID { get; set; }
[XmlAttribute("level")]
public string level { get; set; }
[XmlAttribute("type")]
public string type { get; set; }
[XmlAttribute("class")]
public string className { get; set; }
[XmlElement("Rank")]
public List<Rank> RuleList { get; set; }
}
然后用方法
public void Read()
{
System.Xml.XmlReaderSettings setting = new XmlReaderSettings();
setting.IgnoreComments = true;
XmlReader xmlread = XmlReader.Create("a.config", setting);
XmlSerializer xsl = new XmlSerializer(typeof(RuleSet), "RuleSet");
RuleSet rule = xsl.Deserialize(xmlread) as RuleSet;
xmlread.Close();
}
直接操作内存立的rule就行了。
文件的第二行要加上
<RuleSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="RuleSet">