【问题标题】:LINQ Selecting particular elementLINQ选择特定元素
【发布时间】:2014-07-31 14:41:57
【问题描述】:

基本上,我很难理解我在哪里出错了..

基本上,我有以下 XML:

<Directory>
  <CustDirectory name="Name1">
  <Person name="Foo" />
  <Person name="Goo" />
  <Person name="Gentu" />
  </CustDirectory>

  <CustDirectory name="Name2">
  <Person name="F22" />
  <Person name="Gentu" />
  </CustDirectory>
</Directory>

使用表单,我正在更新联系人列表,我想根据类别(存储为字符串)将列表写入 XML。

因此,我决定使用 LINQ 来执行此操作,但是,我似乎无法弄清楚 .Where 并阅读了有关 stackoverflow 的问题,但似乎无法弄清楚。

这是我的尝试:

var con = e.Element("Directory").Element("CustDirectory").Descendants("Person").Where(p => p.Attribute("name").Value.ToStr == "Name2");

这不起作用并引发空异常...当我取消.Where 子句时,后代中包含的数据正确显示。

谁能告诉我在 LINQ 查询方面哪里出了问题,以便我可以选择特定根的所有后代?

【问题讨论】:

  • e 指的是什么?
  • ToStr 是什么? XAttribute.Value 已经是一个字符串了。
  • @Selman22 对不起,e 指的是 XElement e 用 XML 解析
  • 如果这是 XML 和代码,它应该返回 0 个元素,因为您正在寻找一个不存在的名称。例如,如果您将“Name2”替换为“Foo”,它将起作用。
  • 值 Name2 的属性不在 CustDirectory 元素上吗?您似乎正在搜索 person 子元素..

标签: c# xml linq linq-to-xml


【解决方案1】:

如果我正确理解了您的问题,您将尝试提取属于给定 CustDirectory 的所有 Person 元素。在这种情况下,您应该使用类似的东西:

var con = e.Element("Directory").Descendants("CustDirectory").Where(p => p.Attribute("name").Value == "Name2").Elements("Person");

【讨论】:

    【解决方案2】:

    除了ToStr 部分之外,一切看起来都正确。

    要仅选择名称为 Name2 的 CustDirectory 下的 Person 元素,您需要将 Where 放在上面,如下所示:

    var con = e.Element("Directory").Elements("CustDirectory")
        .First(cd => cd.Attribute("name").Value == "Name2").Descendants("Person");
    

    请注意,我将 Element("CustDirectory") 更改为 Elements("CustDirectory")。

    【讨论】:

      【解决方案3】:

      你不需要 Element("Directory") 开头,因为 e 它本身已经被引用 &lt;Directory&gt; (如果 e 是 XDocument 而不是 XElement 如你在评论中所说,则不同的情况) .这个能够返回&lt;Person&gt; 节点的示例给出了有问题的示例 XML:

      var e = XElement.Parse("...");
      var con = e.Elements("CustDirectory")
                 .Where(p => p.Attribute("name").Value == "Name2")
                 .Elements("Person");
      

      【讨论】:

        【解决方案4】:
        void Main()
        {
            var xml  = @"<Directory>
            <CustDirectory name=""Name1"">
            <Person name=""Foo""/>
            <Person name=""Goo""/>
            <Person name=""Gentu""/>
            </CustDirectory>
            <CustDirectory name=""Name2"">
            <Person name=""F22""/>
            <Person name=""Gentu""/>
            </CustDirectory>
            </Directory>";
            var xmlDoc = XDocument.Parse(xml);
            var con = xmlDoc.Element("Directory")
                            .Elements("CustDirectory")
                            .Where(p => p.Attribute("name").Value == "Name2")
                            .Descendants("Person")
        //  added bonus to get a specific node
        
                            .Where(p => p.Attribute("name").Value == "F22");
            Console.WriteLine(con);
        
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-17
          • 1970-01-01
          • 1970-01-01
          • 2011-08-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多