首页 新闻 会员 周边

linq to xml求解

0
悬赏园豆:200 [已解决问题] 解决于 2012-04-14 19:08

<?xml version="1.0" encoding="utf-8"?>
<WorkflowVml>
  <BtnList id="5">
  <BtnSingle id="A001" name="001" defaultUrl="xxx.aspx" ></BtnSingle>
  <BtnSingle id="A002" name="002" defaultUrl="xxx.aspx" ></BtnSingle>
  <BtnSingle id="A003" name="003" defaultUrl="xxx.aspx" ></BtnSingle>
  <BtnSingle id="A004" name="004" defaultUrl="xxx.aspx" ></BtnSingle>
  </BtnList>
  <BtnList id="7">
  <BtnSingle id="A001" name="001" defaultUrl="xxx.aspx"  ></BtnSingle>
  <BtnSingle id="A002" name="002" defaultUrl="xxx.aspx" ></BtnSingle>
  <BtnSingle id="A003" name="003" defaultUrl="xxx.aspx"  ></BtnSingle>
  <BtnSingle id="A004" name="004" defaultUrl="xxx.aspx" ></BtnSingle>
  </BtnList>
</WorkflowVml>

  XDocument RoAuXml = XDocument.Load(Server.MapPath("Competence.xml"));
  var roauList = from roau in RoAuXml.Descendants("BtnList")
  where roau.FirstAttribute.Value == "7"
  select roau.Elements("BtnSingle");
 然后我不知道怎么从roauList里面用linq把BtnSingle的id等于A001,A002的,name,defaulturl读出来呢?

山古水月的主页 山古水月 | 初学一级 | 园豆:22
提问于:2012-04-12 11:55
< >
分享
最佳答案
1

哈,好高的分。

这个问题如果要用一条简单的语句实现是很难的,而且性能上也不合算,应该分出多条语句来实现最好。下面给你个函数,抛砖引玉,希望能对你有启发。如有问题,可以继续补充。

 

        public IEnumerable GetButtons(XDocument doc, string listID, params string[] btnIds)
        {
            var q = from e in doc.Elements("BtnList") where e.Attribute("id").Value == listID select e.Elements("ButtonSingle");
            return from c in q.Single() where btnIds.Contains(c.Attribute("id").Value) select new { Name = c.Attribute("name").Value, DefaultUrl = c.Attribute("defaulturl").Value };
        }
收获园豆:70
无之无 | 大侠五级 |园豆:5095 | 2012-04-12 14:24
其他回答(4)
1

你好,如果 BtnList 的FirstAttribute 的值是唯一的话 我个人觉得可以这样

var m = from l in (from k in roauList select k).FirstOrDefault() where l.FirstAttribute.Value == "A0001" || l.FirstAttribute.Value == "A0002" select l;

或者

var m = from l in (from k in roauList select k).FirstOrDefault() where l.Attribute("id").Value == "A0001" || l.Attribute("id").Value == "A0002" select l;

不知道能否帮到你

收获园豆:40
病帅少 | 园豆:242 (菜鸟二级) | 2012-04-12 12:37

我的BtnSingle的id等于A001,A002,(A001,A002)它是可变的,它有可能是('A001'),或者是('A001','A002','A003')我想是Where的时候id in('A001','A002')

支持(0) 反对(0) 山古水月 | 园豆:22 (初学一级) | 2012-04-12 12:43

@山古水月: 

List<string> list = new List<string>() {"A001","A002" };

var m = from l in (from k in roauList select k).FirstOrDefault() where list.Contains(l.Attribute("id").Value) select l;

支持(0) 反对(0) 病帅少 | 园豆:242 (菜鸟二级) | 2012-04-12 12:56
0

     XDocument RoAuXml = XDocument.Load("Competence.xml");
            var roaus=RoAuXml.Descendants("BtnList");
            var roauList = from roau in roaus
                           select roau.Elements("BtnSingle").Where(m => m.FirstAttribute.Value == "A001");

收获园豆:40
無限遐想 | 园豆:3740 (老鸟四级) | 2012-04-12 12:44

        XDocument RoAuXml = XDocument.Load("Competence.xml");
            var roaus=RoAuXml.Descendants("BtnList");
            var roauList = from roau in roaus
                           select roau.Elements("BtnSingle").Where(m =>(new string[]{"A001", "A002"}).Contains( m.FirstAttribute.Value));

支持(0) 反对(0) 無限遐想 | 园豆:3740 (老鸟四级) | 2012-04-12 12:52
0

推荐阅读LINQ之路系列第五部分

收获园豆:10
dudu | 园豆:30994 (高人七级) | 2012-04-12 14:11
0
var roaulitItems=roaulit.where(a=>a.Elements("BtnSingle").where(b=>b.id=="A001"||b.id==
"A002").select(new {Name=b.Attribute["name"].Value,DefaultUrl=b.Attribute["defaulturl"].value}));
收获园豆:40
公子小白 | 园豆:284 (菜鸟二级) | 2012-04-13 15:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册