首页 新闻 会员 周边 捐助

新“猿”第一次发帖

0
悬赏园豆:100 [已关闭问题] 关闭于 2013-12-15 17:23

老师让我们做一个用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>
WHUT_田德宇的主页 WHUT_田德宇 | 初学一级 | 园豆:79
提问于:2013-11-04 18:40
< >
分享
所有回答(6)
0

这类问题,一般通过 “C# 读取 XML 文件"等关键字就可以找到答案。学会使用baidu google 解决问题,是学习编程的第一步。祝你早日能够学会使用搜索引擎。 

朝曦 | 园豆:1073 (小虾三级) | 2013-11-04 18:55

关键是我的xml很特别,父节点和子节点们共同决定一条规则,而我要提取xml文档里的所有规则,我需要一个思路。

支持(0) 反对(0) WHUT_田德宇 | 园豆:79 (初学一级) | 2013-11-04 19:03
0

用XDocument 去这里查看详细文档:http://msdn.microsoft.com/zh-cn/library/vstudio/system.xml.linq.xdocument.aspx

XDocument doc = XDocument.Load("x1.xml");  //加载xml 剩下的你看完msdn文档,应该就会用了
秋壶冰月 | 园豆:5903 (大侠五级) | 2013-11-04 19:10
0
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


Zery | 园豆:6151 (大侠五级) | 2013-11-04 20:00
0

你红色部份指的 “表达” 不知道说明什么

思路可以这样:

首先你把XML读进来 转化成 相应 Rank(自己定义,按你的XML,它是可以包含自身集合的) 对象集合

然后通过LINQ 操作 对象集合 得到你想要的数据

Yu | 园豆:12990 (专家六级) | 2013-11-04 22:43

师兄你难得关注我红色的部分,红色部分的意思是,就拿下面的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使用,这块是我不能解决的,不知道你明白没有。

支持(0) 反对(0) WHUT_田德宇 | 园豆:79 (初学一级) | 2013-11-04 23:05

@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));

 

支持(0) 反对(0) Yu | 园豆:12990 (专家六级) | 2013-11-05 09:45
0

看你的XML里面的格式,我觉得完全就没必要这么做,因为ruleID是唯一的!1--11,根据ruleID就可决定规则了,对ID敏感一点,数据类的都是主键,一看到就先判断是不是唯一

iEvent | 园豆:529 (小虾三级) | 2013-11-05 10:13
0

用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">

贪心狸猫 | 园豆:872 (小虾三级) | 2013-11-09 22:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册