C# nooblinq-使用XDocument读取、过滤XML
我正在学习XDocument和LINQ查询。这里有一些简单的XML(在我的浏览器中,它的格式在这个论坛中看起来并不完全正确,但你明白了…)C# nooblinq-使用XDocument读取、过滤XML,c#,linq,linq-to-xml,C#,Linq,Linq To Xml,我正在学习XDocument和LINQ查询。这里有一些简单的XML(在我的浏览器中,它的格式在这个论坛中看起来并不完全正确,但你明白了…) 1. 这是问题1 以下是1的答案 2. 这是问题2 下面是答案2 我可以遍历XML文件中的所有元素,并在如下列表框中显示它们的名称、值和节点类型,没有问题: XDocument doc = XDocument.Load(sPath); IEnumerable<XElement> elems = doc.Desc
1.
这是问题1
以下是1的答案
2.
这是问题2
下面是答案2
我可以遍历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);
}
XDocument doc=XDocument.Load(sPath);
IEnumerable elems=doc.subjects();
IEnumerable元素列表=来自元素中的元素
选择元素;
foreach(元素列表中的元素)
{
String str0=“Name=“+element.Name.ToString()+
“,Value=“+element.Value.ToString()+
“,Nodetype=“+element.Nodetype.ToString();
System.Windows.Controls.Label strLabel=新的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;
IEnumerable元素列表=来自元素中的元素
其中elem.Name.ToString()=“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
,每个对象都包含数字、问题和答案
但是,如果只想提取名称为q_a的元素,可以使用where子句
IEnumerable<XElement> elem_list = elems.Where(elem => elem.Name.LocalName == "q_a");
IEnumerable elem_list=elems.Where(elem=>elem.Name.LocalName==“q_a”);
当然,正如David B所示,此处不需要where子句
IEnumerable<XElement> elem_list = elems.Elements("q_a");
IEnumerable elem_list=elems.Elements(“q_a”);
问题在于Name属性不是字符串,而是一个字符串。当你尝试时,你得到的比你想象的要多得多
<>虽然可以以你尝试的方式写查询,但是也要考虑这些可能性:
//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");
//来自此节点正下方的节点
IEnumerable元素列表=文档元素(“qa”);
//来自此节点下所有级别的节点。
IEnumerable elem_list=文档子体(“qa”);
但是,要将非限定名称作为字符串获取,他可以使用elem.name.LocalName.
//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");