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 表达式或经典查询)