【问题标题】:Xdocument, picking the right nodesXdocument,选择正确的节点
【发布时间】:2010-11-11 03:37:53
【问题描述】:

我正在尝试构建一个 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 子句中添加什么,或者有更好的方法吗?

【问题讨论】:

    标签: c# linq-to-xml


    【解决方案1】:

    你可以试试:

    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>();
    

    【讨论】:

    • 如果我想通过 node.Name 在哈希表中添加所有 xml 节点怎么办?
    【解决方案2】:
    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>();
    

    【讨论】:

    • +1:你的工作也一样。弗雷德里克快了一分钟。谢谢,
    • @Chris Lively:不总是这样吗 :) 很高兴为您提供帮助。
    猜你喜欢
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多