当前位置:编程学习 > C#/ASP.NET >>

linq根据条件查询XML文件,查询后如何赋值?

没怎么接触过linq......
xml文件格式:
<?xml version="1.0"?>
<channel>
  <item>
    <Id>2</Id>
    <names>A</names>
  </item>
  <item>
    <Id>3</Id>
    <names>B</names>
  </item>
</channel>
</xml>

XElement xe = XElement.Load("YlClass.xml");//载入文件
IEnumerable<XElement> Yl = from e in xe.Element("item")                    
                           where e.Attribute("names").Value == Str1//Str1查询条件
                           select e;//根据names为查询条件,查出Id
string Id = //满足条件的查询结果,这个怎么写?
XML LINQ select String --------------------编程问答-------------------- foreach(XElement el in Yl)
   Id += el.Attribute("Id").Value; --------------------编程问答-------------------- 或

XElement xe = XElement.Load("YlClass.xml");//载入文件
var res= (from e in xe.Element("item")                    
                           where e.Attribute("names").Value == Str1//Str1查询条件
                           select new {Id=e.Attribute("Id").Value}).ToArray();//根据names为查询条件,查出Id
--------------------编程问答-------------------- 根据NAME标签只能查到一个ID还是多个? --------------------编程问答--------------------
string[] Ids = (from e in xe.Descendants("item")                    
   where e.Attribute("names").Value == Str1 
   select   e.Attribute("Id").Value).ToArray();
--------------------编程问答-------------------- var query= xe.Elements().Where(p => p.Element("names").Value == Str1).Select(p=>p.Element("Id").Value);多个
var query= xe.Elements().FirstOrDefault(p => p.Element("names").Value == Str1).Attribute("Id").Value;单个 --------------------编程问答-------------------- var query= xe.Elements().Where(p => p.Element("names").Value == Str1).Select(p=>p.Element("Id").Value);多个
var query= xe.Elements().FirstOrDefault(p => p.Element("names").Value == Str1).Attribute("Id").Value;单个 



+1 --------------------编程问答--------------------
string[] Ids = (from e in xe.Descendants("item")                    
   where e.Attribute("names").Value == Str1 
   select   e.Attribute("Id").Value).ToArray();

string Id = Ids.ToString();

//MessageBox.Show(Id); //没Show出来,没反应。

MessageBox.Show("dao");//代码执行没有到这里。


楼上的几位的方法都试过了,也是同样的情况,这是什么原因?

--------------------编程问答-------------------- string Id = Ids.ToString();
=====
你这句话是什么个意思?  直接将数组付值给string?

应该这样吧:

string Id = String.Join(",",Ids); --------------------编程问答-------------------- 版主,也一样,程序不到这里!Show不出来 --------------------编程问答-------------------- 要么帖出异常信息,要么帖出上下文方法
不然神也帮不了你
如果我这个代码是写在事件里的,就将 e换成别的字母:

string[] Ids = (from x in xe.Descendants("item")                    
                           where x.Attribute("names").Value == Str1 
                           select  x.Attribute("Id").Value).ToArray(); --------------------编程问答--------------------

                        string Str1 = "A";
                        XElement xe = XElement.Load("YlClass.xml");
                        string[] Ids = (from c in xe.Descendants("item")
                                        where c.Attribute("typenames").Value == Str15
                                        select c.Attribute("Id").Value).ToArray();
                        string Id = String.Join(",", Ids); 


                        MessageBox.Show(Str1);//Show不出来,程序没到这里
                           MessageBox.Show(Id);//Show不出来,程序没到这里
//如果把那个Linq查询代码给注释掉,MessageBox.Show(Str1);//Show出来的


--------------------编程问答--------------------

string Id = String.Join(",", Ids);//把这行设为断点后,程序没运行到这里。  
--------------------编程问答-------------------- 程序编译正常通过,没有任何错误信息。 --------------------编程问答--------------------
引用 12 楼 wuhuanghao 的回复:

string Id = String.Join(",", Ids);//把这行设为断点后,程序没运行到这里。  


前面是不是有if分支,条件没满足啊 --------------------编程问答-------------------- 没有If语句呀。。。。 --------------------编程问答--------------------


                        string Str1 = "A";
                        XElement xe = XElement.Load("YlClass.xml");
                        string[] Ids = (from c in xe.Descendants("item")//这里改为XML文件中的:channel
                                        where c.Attribute("typenames").Value == Str15
                                        select c.Attribute("Id").Value).ToArray();
                        string Id = String.Join(",", Ids); 

                           MessageBox.Show(Id);//Show出来了,但是为空值!
--------------------编程问答--------------------

string Str1 = "A";
            XElement xe = XElement.Load("D:\\1.xml");
            string[] Ids = (from c in xe.Elements("item")
                            where c.Element("typenames").Value == Str1
                            select c.Element("Id").Value).ToArray();
            string Id = String.Join(",", Ids);
--------------------编程问答-------------------- LINQ TO XML
参考http://blog.csdn.net/chinajiyong/article/details/7485019 --------------------编程问答--------------------
引用 17 楼 Chinajiyong 的回复:

string Str1 = "A";
            XElement xe = XElement.Load("D:\\1.xml");
            string[] Ids = (from c in xe.Elements("item")
                            where c.Element("typenames").Value == Str1
                            select c.Element("Id").Value).ToArray();
            string Id = String.Join(",", Ids);



哥哥,where c.Element("typenames").Value == Str1

Element没有这个Value的方法,好不好? --------------------编程问答-------------------- 不会哦。


--------------------编程问答--------------------

XElement xe = XElement.Load("YlClass.xml");
                        string[] Ids = (from c in xe.Elements("item")
                                        where c.Element("typenames").Value == Str1
                                        select c.Element("Id").Value).ToArray();
                        string Id = String.Join(",", Ids);
                        string SmallXml = string.Format("xml/Mark{0}.xml", Id);//加载新的文件查找下一级
                        XElement xes = XElement.Load(SmallXml);//加载成功。
                        string[] Idss = (from d in xes.Elements("item")
                                         where d.Element("names").Value == Str1 && d.Element("corpname").Value == Str2 //根据获得到的ClassId和大类名称查询
                                         select d.Element("Id").Value).ToArray();//这里需要查询第二个XML文件中的ID,names,corpId,corpname,这个四个字段内容,应该怎么写?

--------------------编程问答--------------------  string[] Idss = (from d in xes.Elements("item")                                         where d.Element("names").Value == Str1 && d.Element("corpname").Value == Str2 //根据获得到的ClassId和大类名称查询                                         select new 
{
 d.Element("Id").Value,
 d.Element("names").Value,
 d.Element("corpId").Value,
 d.Element("corpname").Value
}).ToArray();//这里需要查询第二个XML文件中的ID,names,corpId,corpname --------------------编程问答--------------------  d.Element("names").Value,
 d.Element("corpId").Value,
 d.Element("corpname").Value
 这里提示:匿名类型不能具有名称相同的属性 。

还有我如何赋值 ? 

string names = ?(d.Element("names").Value的值) --------------------编程问答-------------------- 搞不定,提示:匿名类型不能具有名称相同的属性 。

--------------------编程问答-------------------- 除 --------------------编程问答--------------------

                        var Idss = from d in xes.Elements("item")
                                         where d.Element("names").Value == Str17.Trim() && d.Element("corpname").Value == Str18.Trim()
                                        // select d.Element("Id").Value).ToArray();
                                         select new
                                         {
                                           Id = d.Element("Id").Value,
                                           names = d.Element("names").Value,
                                           corpid = d.Element("corpid").Value,
                                            corpname = d.Element("corpname").Value
                                         };


运行通过,但是select new处设置断点后,无效。 另外,我如何取出里面的值:Id,names,coprid,corpname ?

--------------------编程问答-------------------- select new处设置断点后,无效?什么意思??
foreache(var q in Idss)
{
   //q.Id,q.names
}
--------------------编程问答-------------------- 版主呢,版主呢,求救,求救啊。。。。 --------------------编程问答--------------------
引用 27 楼 Chinajiyong 的回复:
select new处设置断点后,无效?什么意思??
foreache(var q in Idss)
{
   //q.Id,q.names
}


哥哥,你终于出现了,在你消失的日子里,我吃不下,睡不好,喝不了,日也想,夜也思。骚年,你终于出现了。

这句话的意思是程序,直接约过这段代码,直接处理异常了。 --------------------编程问答--------------------
引用 29 楼 wuhuanghao 的回复:
Quote: 引用 27 楼 Chinajiyong 的回复:

select new处设置断点后,无效?什么意思??
foreache(var q in Idss)
{
   //q.Id,q.names
}


哥哥,你终于出现了,在你消失的日子里,我吃不下,睡不好,喝不了,日也想,夜也思。骚年,你终于出现了。

这句话的意思是程序,直接约过这段代码,直接处理异常了。

那就是抛异常呢??什么异常?? --------------------编程问答-------------------- 不清楚,可能执行到这里,无效,直接越过了。当时我怕程序出现异常导致崩溃,我另外加了个异常处理方法。

问题已经搞定了,谢谢骚年。给分结贴。

我也不知道是怎么解决的,莫名其妙的,一运行,好了。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,