Linq to XML:从查询到变量

Posted

技术标签:

【中文标题】Linq to XML:从查询到变量【英文标题】:Linq to XML: from query to variable 【发布时间】:2013-07-20 10:49:47 【问题描述】:

这是我写的:

        XDocument doc = XDocument.Load("test.xml");
        string nodeName = "Mike";
        var query = from el in doc.Descendants("dogs")
                    where (string)el.Attribute("name") == nodeName
                    select
                    "Name: " + nodeName
                    + "\n" + "Breed: " + (string)el.Element("breed")
                    + "\n" + "Sex: " + (string)el.Element("sex");
        foreach (string data in query)
            MessageBox.Show(data);

由于我想加载这些数据,我想将它们放入变量中,以便以后能够将它们放入 textBoxes、radioBoxes 等。目前我只知道如何使用 MessageBox 显示它。

【问题讨论】:

【参考方案1】:

您可以拨打Enumerable.ToList将它们收藏起来以备后用。

var result = query.ToList();
foreach (string data in result)
        MessageBox.Show(data);

//result is available for later use

【讨论】:

【参考方案2】:

不确定你是否指的是这个,但你可以试试看:

创建一个新的公共类:

    public class XmlResut
    
        public string Name  get; set; 
        public string Breed  get; set; 
        public string Sex  get; set;  // Maybe a enum would fit this property better
    

现在您更改 LINQ 以使用 select new (http://www.dotnetperls.com/select-new) 创建已定义类的新实例

    XDocument doc = XDocument.Load("test.xml");
    string nodeName = "Mike";
    var query = from el in doc.Descendants("dogs")
                where (string)el.Attribute("name") == nodeName
                select new XmlResult()
                    Name = nodeName,
                    Breed = (string)el.Element("breed")
                    Sex = (string)el.Element("sex")
                ;
    foreach (string data in query)
    
        Console.WriteLine(data.Name);
        Console.WriteLine(data.Breed);
        Console.WriteLine(data.Sex);
    

【讨论】:

为什么不序列化呢? @Ron Sijm:不知道PotatoBox会不会知道序列化,但是你可以对这个问题做出回答并解释给他听。我尽量保持“简单”。 不是我真正想要的,但从那里开始解决了我的问题,所以很有帮助,谢谢。 你能发布你的解决方案吗?【参考方案3】:

好的,我不知道是否有更好的方法来实现我想要的,但它确实有效。

    public class Data
    
    public string name  get; set; 
    public string breed  get; set; 
    public string sex  get; set; 
    

和方法:

                  XDocument doc = XDocument.Load(@"test.xml");
                  string nodeName = "Mike";
                  var data = from q in doc.Descendants("dogs")
                  where (string)q.Attribute("name") == nodeName
                      select new Data
                      
                          name = q.Attribute("name").Value,
                          breed = q.Element("breed").Value,
                          sex = q.Element("sex").Value
                      ;
                  foreach (var element in data)
                  
                      textBox1.Text = element.name;
                      comboBox1.Text = element.sex;
                      textBox2.Text = element.breed;
                  

【讨论】:

嗯,我没有意识到这一点,但你是对的。我想我会把他的答案标记为解决方案。 起初我并没有真正看到任何区别,唯一不同的是您现在使用了正确的 .Value 属性(尽管并非一直如此)。顺便说一句,我希望你知道你的文本框/组合框将只保存最后找到的条目,因为你总是通过枚举抛出查询来覆盖 .Text 属性。 你是对的。我将添加另一个“where”,它将包含“breed”,因为两只不同的狗可能有相同的名字,但不同的品种。我明天会这样做,看看是否有效。或者你知道更好的方法?

以上是关于Linq to XML:从查询到变量的主要内容,如果未能解决你的问题,请参考以下文章

Linq to XML 从 config.xml 选择节点(Lambda 表达式或经典查询)

linq to sql select和where的区别

Linq基本子句

如何/我可以使用 linq to xml 以合理的内存消耗查询巨大的 xml 文件?

linq to xml 初学 -- 查询语法

如何使用 linq-to-xml 查询简化此功能?