Noob LINQ - 使用XDocument读取,过滤XML
问题描述:
我刚学习XDocument和LINQ查询。下面是一些简单的XML(这看起来并不在这个论坛在我的浏览器完全正确的格式,但你的想法。)Noob LINQ - 使用XDocument读取,过滤XML
<?xml version="1.0" encoding="utf-8"?>
<quiz
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com/name XMLFile2.xsd"
title="MyQuiz1">
<q_a>
<q_a_num>1</q_a_num>
<q_>Here is question 1</q_>
<_a>Here is the answer to 1</_a>
</q_a>
<q_a>
<q_a_num>2</q_a_num>
<q_>Here is question 2</q_>
<_a>Here is the answer to 2</_a>
</q_a>
</quiz>
我可以在XML文件中所有的元素进行迭代,并显示其名称,价值,和节点类型在这样一个列表框,没有问题:
XDocument doc = XDocument.Load(sPath);
IEnumerable<XElement> elems = doc.Descendants();
IEnumerable<XElement> elem_list = from elem in elems
select elem;
foreach (XElement element in elem_list)
{
String str0 = "Name = " + element.Name.ToString() +
", Value = " + element.Value.ToString() +
", Nodetype = " + element.NodeType.ToString();
System.Windows.Controls.Label strLabel = new System.Windows.Controls.Label();
strLabel.Content = str0;
listBox1.Items.Add(strLabel);
}
...但现在我想一个“where”子句添加到我的查询,让我只能选择具有特定名称的元素(如,“qa”)但我的元素列表空了。我试过了 。 。 。
IEnumerable<XElement> elem_list = from elem in elems
where elem.Name.ToString() == "qa"
select elem;
有人请解释我在做什么错吗? (并且一般来说有一些调试查询的好技巧?)提前致谢!
答
问题是Name属性不是字符串,它是XName。当你对它进行约束时,你会得到比你想象的更多的东西。
虽然可以写在你尝试的方式查询,还考虑这些possibilites:
//from nodes immediately below this one
IEnumerable<XElement> elem_list = doc.Elements("qa");
//from nodes of all levels below this node.
IEnumerable<XElement> elem_list = doc.Descendants("qa");
答
我想你也许查询更改的东西,看起来更像是这个
var query = from q_a in document.Descendants("q_a")
select new
{
Number = (int)q_a.Element("q_a_num"),
Question = (string)q_a.Element("q_"),
Answer = (string)q_a.Element("_a")
};
有了这个,你会从每个q_a
后裔内部元件的拉入IEnumerable<[Anonymous Type]>
,包含数字的每个对象,问题和答案。
但是,如果您只是想提取名称为q_a的XElements,则可以使用where子句执行此操作。
IEnumerable<XElement> elem_list = elems.Where(elem => elem.Name.LocalName == "q_a");
当然,正如大卫B所示,where子句在这里没有必要。
IEnumerable<XElement> elem_list = elems.Elements("q_a");
然而,让不合格的字符串名字,他可以用'elem.Name。 LocalName.' – 2010-04-14 04:06:43