Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# nooblinq-使用XDocument读取、过滤XML_C#_Linq_Linq To Xml - Fatal编程技术网

C# nooblinq-使用XDocument读取、过滤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

我正在学习XDocument和LINQ查询。这里有一些简单的XML(在我的浏览器中,它的格式在这个论坛中看起来并不完全正确,但你明白了…)


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");