【问题标题】:Convert LINQ to XML将 LINQ 转换为 XML
【发布时间】:2011-06-17 01:47:03
【问题描述】:
<?xml version="1.0" encoding="UTF-8" ?>
<Accounts>
  <Account id="usama" password="3210" lastUpdated="6/16/2011 11:21:59 AM" nextUpdate="6/16/2011 11:36:59 AM">
    <SubAccount id="false">
      <Url>yahoo</Url>
      <Review>not so good</Review>
    </SubAccount>
    <SubAccount id="false">
      <Url>google</Url>
      <Review>as good as heard.</Review>
    </SubAccount>
  </Account>
</Accounts>

假设我想获取所有最后更新日期小于或等于今天(假设 6/17/2011)日期的结果。

所以我的结果应该是这样的。

Accout id =usama ,passwod =3210 ,url=yahoo, review=not so good
Accout id =usama ,passwod =3210 ,url=google, review=as good as heard

到目前为止,我已经编写了查询

var q = from c in doc.Descendants("Accounts")
        from a in c.Descendants("Account")
        where a.Attribute("nextUpdate").Value == "6/16/2011 11:36:59 AM"
        select new
               {                        
                 accountName = a.Attribute("id").Value,                       
                 password = a.Attribute("password").Value,                        
                 url = a.Descendants("SubAccount").Descendants("Url").ToString() 
                 //review=a.Attribute("nextUpdate").Value
               }

我可以正常获取用户名和密码,但我不知道如何获取 URL 和查看。另外如何将 where 子句中的 Attribute("nextUpdate") 转换为日期时间,以便我可以将其与日期进行比较?

【问题讨论】:

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


    【解决方案1】:

    试试这个(测试和工作):

    DateTime someTime = DateTime.Now;
    var q = from a in doc.Descendants("Account")
            from sub in a.Elements("SubAccount")
            where (DateTime)a.Attribute("nextUpdate") <= someTime 
            select new
            {  
                accountName = a.Attribute("id").Value,  
                password = a.Attribute("password").Value,  
                url = (string)sub.Element("Url").Value,
                review = (string)sub.Element("Review").Value
            }
    

    这使用了 Linq to XML 提供的 DateTime 转换(另见 here)。

    【讨论】:

      【解决方案2】:

      这是我的建议。

      var doc = XElement.Load(...);
      var q =
          from account in doc.Elements("Account")
          let nextUpdate = XmlConvert.ToDateTime(account.Attribute("nextUpdate").Value, "your date format").Date
          where nextUpdate <= DateTime.Today
          from subAccount in account.Elements("SubAccount")
          select new
          { 
            Id = account.Attribute("id").Value,
            Password = account.Attribute("password").Value,
            Url = subAccount.Element("Url").Value,
            Review= subAccount.Element("Review").Value,
          }
      

      不要忘记用适当的格式字符串替换“您的日期格式”。 http://msdn.microsoft.com/en-us/library/kzk5c6y9.aspx

      【讨论】:

        【解决方案3】:

        这样的?

        var q =
            from account in doc.Descendants("Account")
            from subAcount in account.Elements("SubAccount")
            where DateTime.Parse(account.Attribute("nextUpdate").Value) == filterDateTime
            select new
            {
                accountName = account.Attribute("id").Value,
                password = account.Attribute("password").Value,
                url = subAcount.Element("Url").Value,
                review = subAcount.Element("Review").Value
            };
        

        filterDateTimeDateTime 的变量。

        【讨论】:

        • 这只会返回帐户中第一个 SubAccount 元素的结果,而不是 OP 想要的结果。
        • 谢谢!但是这个查询给了我节点中的第一个元素。所以它返回账户 id =usama ,passwod =3210 ,url=yahoo,review=not so good only .我也想要第二个作为被问到。
        • @Zain, @BrokenGlass - 是的,我忽略了 xml 中的多个子帐户。固定。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-04
        • 1970-01-01
        • 1970-01-01
        • 2012-08-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多