【问题标题】:Linq to XML: from query to variableLinq to XML:从查询到变量
【发布时间】: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 显示它。

【问题讨论】:

    标签: c# visual-studio-2010 xml-parsing linq-to-xml


    【解决方案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”,因为两只不同的狗可能有相同的名字,但不同的品种。我明天会这样做,看看是否有效。或者你知道更好的方法?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多