c# - XElement 查询给出错误 : "Sequence contains no elements"

标签 c# asp.net xml linq linq-to-xml

我正在尝试查询此 xml:

<pageMap>
  <pageMapNode id="8039CE09-E7DA-47E1-BCEC-DF96B5E411F4">
    <pageMapNode id="79DC0E8A-82F1-47DF-836E-099665A7D2E3"></pageMapNode>
    <pageMapNode id="3B79FAAC-EB2D-41AC-A91E-12541D0EB377">
      <pageMapNode id="170A9FC3-C03E-4088-AC5E-93AA038E0114"></pageMapNode>
    </pageMapNode>
  </pageMapNode>
  <pageMapNode id="A34CADA7-317D-405C-8E8F-DB113F40407F"></pageMapNode>
</pageMap>

这是我的功能:

protected string GetParent(Guid nodeId)
{
    XDocument doc = XDocument.Parse(GetXml());  // parses xml displayed above

    // returns the 5 page map nodes displayed above
    IEnumerable<XElement> nodes = doc.Descendants("pageMapNode");

    // error: "Sequence contains no elements"
    XElement node = doc.Descendants("pageMapNode")
        .Where(n => n.Attribute("id").ToString().ToLower() == 
            nodeId.ToString().ToLower()).Single();

    ...
}

我传入的 nodeId 参数是正确的 - 我应该得到一个匹配项,所以我不知道为什么会返回错误。

有人看到我做错了什么吗?

最佳答案

n.Attribute("id") 返回一个 XAttribute,而不是一个字符串。您需要 .Value 而不是 .ToString()

XElement node = doc.Descendants("pageMapNode")
    .Where(n => n.Attribute("id").Value.ToLower() == 
        nodeId.ToString().ToLower()).Single();

你可以将它缩短为

XElement node = doc.Descendants("pageMapNode")
    .Single(n => n.Attribute("id").Value.ToLower() == 
        nodeId.ToString().ToLower());

关于c# - XElement 查询给出错误 : "Sequence contains no elements",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13771864/

相关文章:

c# - 反射以查找方法是否正在使用任何特定方法

c# - 资源泄漏和内存泄漏与性能之间的关系

javascript - 如何在下拉菜单中将复选标记显示为文本?

javascript - 如何从后面的代码关闭 Bootstrap 模式?

c# - 如何从语音识别中提取变量

c# - 在C#中,你如何称呼数组引入的那种多态性?

c# - 在 Page.Load 期间确定是否要处理 Button 单击事件

xml - 站点地图 URLset 中的最佳 URL 数量

C# - XML 子节点到文本框

python - 使用转义的 xml 作为属性使用 SOAP web 服务