代码之家  ›  专栏  ›  技术社区  ›  Ignacio

使用xdocument按属性查找元素

  •  24
  • Ignacio  · 技术社区  · 14 年前

    此查询似乎有效,但我有0个结果。

    IEnumerable<XElement> users =
                (from el in XMLDoc.Elements("Users")
                 where (string)el.Attribute("GUID") == userGUID.ToString()
                 select el);
    

    我的XML如下:

    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <Users>
      <User GUID="68327fe2-d6f0-403b-a7b6-51860fbf0b2f">
        <Key ID="F7000012ECEAD101">
          ...
        </Key>
      </User>
    
    </Users>
    

    你有什么线索可以说明这件事吗?

    2 回复  |  直到 8 年前
        1
  •  32
  •   FoldFence    8 年前

    改变 Users 在第二行 User . 这样地:

        IEnumerable<XElement> users = (from el in XMLDoc.Root.Elements("User")
                                       where (string)el.Attribute("GUID") ==  userGUID.ToString()
                                       select el);
    

    我假设xmldoc是一个xdocument,而不是根元素本身。

        2
  •  46
  •   Jon Skeet    14 年前

    嗯, 用户 元素没有guid属性。两个建议选项:

    • XDocument.Root.Elements("User")
    • 使用 Descendants("User") 寻找 全部的 用户元素。

    我暂时坚持前者。这给了我们:

    IEnumerable<XElement> users =
                (from el in XMLDoc.Root.Elements("User")
                 where (string) el.Attribute("GUID") == userGUID.ToString()
                 select el);
    

    现在,我们还可以进一步整理。首先,让我们来看看 Guid 而不是 string :

    IEnumerable<XElement> users =
        (from el in XMLDoc.Root.Elements("User")
         where (Guid) el.Attribute("GUID") == userGUID
         select el);
    

    不过,在这里使用查询表达式的理由并不多…你所应用的只是一个谓词。我们就用 Where 直接方法:

    IEnumerable<XElement> users = 
        XMLDoc.Root
              .Elements("User")
              .Where(el => (Guid) el.Attribute("GUID") == userGUID);
    

    当然,你的布局取决于你:)用一条较长的线,你可以把所有的东西都排在一条较长的第一行下面:

    IEnumerable<XElement> users = XMLDoc.Root
                                        . etc
    

    现在,最后-如果user元素没有guid属性呢?当前,此代码将引发异常。这可能正是你想要的——也可能不是。如果不是,你可以让它忽略这些事情 Nullable<Guid> 阿卡 Guid? 而是:

    IEnumerable<XElement> users = 
        XMLDoc.Root
              .Elements("User")
              .Where(el => (Guid?) el.Attribute("GUID") == userGUID);