X文档遍历

发布于 2024-12-20 22:33:35 字数 938 浏览 0 评论 0原文

我是 LINQ to XML 世界的新手。我正在尝试检索 Identity 的值,但仅当 Credentialdomain 属性为“NetworkID”时。这是我正在测试的代码:

XML 片段:

<Sender>
  <Credential domain="NetworkID">
    <Identity>MyIdentity</Identity>
    <SharedSecret>MySharedSecret</SharedSecret>
  </Credential>
  <UserAgent>MyUserAgent</UserAgent>
</Sender>

C#:

var credential = xdoc.Descendants("Sender")
         .Elements("Credential")
         .Where(x => x.Attribute("domain").Value == "NetworkID").FirstOrDefault()
         .Descendants("Identity").FirstOrDefault();

问题:

显然,如果 Credential 节点未找到,LINQ 查询将生成错误,因为我在 null 上调用 .Descendants()

是否可以编写查询,以便在未找到任何一个元素时返回 Identitynull

I'm new the the LINQ to XML world. I'm attempting to retrieve the value of Identity but only when the domain attribute of Credential is "NetworkID". Here's the code I'm testing with:

XML Snippet:

<Sender>
  <Credential domain="NetworkID">
    <Identity>MyIdentity</Identity>
    <SharedSecret>MySharedSecret</SharedSecret>
  </Credential>
  <UserAgent>MyUserAgent</UserAgent>
</Sender>

C#:

var credential = xdoc.Descendants("Sender")
         .Elements("Credential")
         .Where(x => x.Attribute("domain").Value == "NetworkID").FirstOrDefault()
         .Descendants("Identity").FirstOrDefault();

Question:

Obviously, if the Credential node is not found, the LINQ query will generate an error because I'm calling .Descendants() on null.

Is it possible to write the query so that it return Identity or null if either element is not found?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

寒冷纷飞旳雪 2024-12-27 22:33:35

只需删除 Where() 之后的 FirstOrDefault()

var credential = xdoc.Descendants("Sender")
                     .Elements("Credential")
                     .Where(x => x.Attribute("domain").Value == "NetworkID")
                     .Descendants("Identity")
                     .FirstOrDefault();

Where() 返回空结果集,而 FirstOrDefault()空结果集返回 null 这就是 .Where().FirstOrDefault().Descendants() 导致 null 引用异常的原因。

Just remove FirstOrDefault() after the Where():

var credential = xdoc.Descendants("Sender")
                     .Elements("Credential")
                     .Where(x => x.Attribute("domain").Value == "NetworkID")
                     .Descendants("Identity")
                     .FirstOrDefault();

Where() returns empty result set and FirstOrDefault() on empty result set returns null this is why .Where().FirstOrDefault().Descendants() caused null reference exception.

痴情 2024-12-27 22:33:35

如果你使用

    var identity = 
        xdoc.Descendants("Sender")
        .Elements("Credential")
        .Where(x => (string)x.Attribute("domain") == "NetworkID")
        .Descendants("Identity")
        .FirstOrDefault();

你应该会得到你想要的。或者您需要分解代码,在第一部分中执行一个 FirstOrDefault() 例如

   var credential = xdoc.Descendants("Sender").Elements("Credential").FirstOrDefault(c => (string)c.Attribute("domain") == "NetworkID");
   var identity = credential != null ? credential.Element("Identity") : null;

If you use

    var identity = 
        xdoc.Descendants("Sender")
        .Elements("Credential")
        .Where(x => (string)x.Attribute("domain") == "NetworkID")
        .Descendants("Identity")
        .FirstOrDefault();

you should get what you want. Or you need to break the code up, doing one FirstOrDefault() in the first part e.g.

   var credential = xdoc.Descendants("Sender").Elements("Credential").FirstOrDefault(c => (string)c.Attribute("domain") == "NetworkID");
   var identity = credential != null ? credential.Element("Identity") : null;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文