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

xdocument,选择正确的节点

  •  1
  • ChrisLively  · 技术社区  · 14 年前

    我正在尝试构造一个Linq查询,它将提取具有特定元素的所有节点。

    在下面的例子中,您会注意到第二个条目有一些额外的元素:displayonsignup、sortorder等。

    我希望Linq给我所有具有sortOrder元素的入口节点。

    XML文档如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <feed >
        <entry>
            <link href="/ws/customers/testacct/lists/removed" rel="edit"></link>
            <id>http://api.constantcontact.com/ws/customers/testacct/lists/removed</id>
            <title type="text">Removed</title>
            <updated>2010-11-10T19:03:09.253Z</updated>
            <author>
                <name>Test</name>
            </author>
            <content type="application/vnd.ctct+xml">
                <ContactList id="http://api.constantcontact.com/ws/customers/testacct/lists/removed">
                    <Name>Removed</Name>
                    <ShortName>Removed</ShortName>
                </ContactList>
            </content>
        </entry>
        <entry>
            <link href="/ws/customers/testacct/lists/1" rel="edit"></link>
            <id>http://api.constantcontact.com/ws/customers/testacct/lists/1</id>
            <title type="text">General Interest</title>
            <updated>2010-11-10T19:03:09.253Z</updated>
            <author>
                <name>Constant Contact</name>
            </author>
            <content type="application/vnd.ctct+xml">
                <ContactList id="http://api.constantcontact.com/ws/customers/testacct/lists/1">
                    <OptInDefault>true</OptInDefault>
                    <Name>General Interest</Name>
                    <ShortName>General Interest</ShortName>
                    <DisplayOnSignup>Yes</DisplayOnSignup>
                    <SortOrder>0</SortOrder>
                    <Members id="http://api.constantcontact.com/ws/customers/testacct/lists/1/members"></Members>
                    <ContactCount>3</ContactCount>
                </ContactList>
            </content>
        </entry>
    </feed>
    

    到目前为止,我的查询如下:

    XDocument loaded = XDocument.Parse(response);
    
    result = (from entry in loaded.Descendants("entry")
          select new CcList {
              LinkHref = entry.Element("link").Attribute("href").Value,
              Id = entry.Element("id").Value,
              Title = entry.Element("title").Value,
              Updated = entry.Element("updated").Value,
              ListName = entry.Element("content").Element("ContactList").Element("Name").Value,
              OptInDefault = entry.Element("content").Element("ContactList").Element("OptInDefault").Value,
              ShortName = entry.Element("content").Element("ContactList").Element("ShortName").Value,
              SortOrder = entry.Element("content").Element("ContactList").Element("SortOrder").Value
          }).ToList<CcList>();
    

    我应该把什么作为where子句,还是有更好的方法?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Frédéric Hamidi    14 年前

    您可以尝试:

    var result = (
        from entry in loaded.Descendants("entry")
        where entry.Descendants("SortOrder").Count() > 0
        select new CcList {
            LinkHref = entry.Element("link").Attribute("href").Value,
            Id = entry.Element("id").Value,
            Title = entry.Element("title").Value,
            Updated = entry.Element("updated").Value,
            ListName = entry.Element("content").Element("ContactList").Element("Name").Value,
            OptInDefault = entry.Element("content").Element("ContactList").Element("OptInDefault").Value,
            ShortName = entry.Element("content").Element("ContactList").Element("ShortName").Value,
            SortOrder = entry.Element("content").Element("ContactList").Element("SortOrder").Value
        }
    ).ToList<CcList>();
    
        2
  •  3
  •   Sorax    14 年前
    XDocument loaded = XDocument.Parse(response);
    
    var result = (
              from entry in loaded.Descendants("entry")
              where entry.Descendants().Any(x => x.Name == "SortOrder")
              select new CcList {
                 LinkHref = entry.Element("link").Attribute("href").Value,
                 Id = entry.Element("id").Value,
                 Title = entry.Element("title").Value,
                 Updated = entry.Element("updated").Value,
                 ListName = entry.Element("content").Element("ContactList").Element("Name").Value,
                 OptInDefault = entry.Element("content").Element("ContactList").Element("OptInDefault").Value,
                 ShortName = entry.Element("content").Element("ContactList").Element("ShortName").Value,
                 SortOrder = entry.Element("content").Element("ContactList").Element("SortOrder").Value
              }).ToList<CcList>();