【问题标题】:Parsing Receipt XML with LINQ使用 LINQ 解析收据 XML
【发布时间】:2012-11-24 12:41:17
【问题描述】:

我正在开发一个使用店内购买的 Windows 应用商店应用。进行购买时,会返回一些 XML。我正在尝试查看用户是否成功购买了该产品。我知道我可以使用 LINQ 确定这一点,但我不确定如何编写我的 LINQ 查询。

private bool WasProductPurchasedFromStore(string productName)
{
        string data = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Receipt Version=\"1.0\" ReceiptDate=\"2012-11-24T12:22:20Z\" CertificateId=\"\" ReceiptDeviceId=\"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa\"><ProductReceipt Id=\"bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb\" AppId=\"MyNamespace.MyApp_t7396xywk1mky\" ProductId=\"Upgrade\" PurchaseDate=\"2012-11-24T12:22:20Z\" ProductType=\"Durable\"  /></Receipt>";
  XDocument xml = XDocument.Parse(data);

  // Return true if the productName is found in the XML.
  // THIS IS WHERE I'M STUCK
  var result = from receipt in xml
               select receipt;

  // Return false if the user did not make the purchase
  return false;
}

如何查询我的 xml 以查看是否有 ProductReceipt 元素具有与 productName 中的值匹配的 ProductId 属性值?

感谢您的帮助!

【问题讨论】:

    标签: c# xml linq


    【解决方案1】:

    如果你总是知道元素和属性会在那里,试试这样:

    bool result = xml.Descendants("ProductReceipt")
        .Attributes().Single(x => x.Name == "ProductId")
        .Value == productName;
    

    如果元素和属性可能丢失,您可以在每个步骤中执行 SingleOrDefault 和 null 检查

    【讨论】:

      【解决方案2】:

      假设您的产品名称在 AppId 属性中,我会这样做

      private bool WasProductPurchasedFromStore(string productName)
      {
          string data = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Receipt Version=\"1.0\" ReceiptDate=\"2012-11-24T12:22:20Z\" CertificateId=\"\" ReceiptDeviceId=\"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa\"><ProductReceipt Id=\"bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb\" AppId=\"MyNamespace.MyApp_t7396xywk1mky\" ProductId=\"Upgrade\" PurchaseDate=\"2012-11-24T12:22:20Z\" ProductType=\"Durable\"  /></Receipt>";
          XDocument xml = XDocument.Parse(data);
      
          return xml.Descendants("ProductReceipt")
              .Any(e => string.Compare(e.Attribute("AppId").Value, productName, StringComparison.InvariantCultureIgnoreCase) == 0);
      }
      

      【讨论】:

        【解决方案3】:

        试试这个:

        var result = from productReceipt in xml.Root.Elements("ProductReceipt")
                        from prodId in productReceipt.Attributes("ProductId")
                        where prodId.Value == productName
                        select prodId.Value;
        
        return = result.Any();
        

        xml.RootReceipt 元素,Elements 方法返回具有给定名称的元素序列,Attributes 方法返回具有给定名称的属性序列。从您提供的 XML 示例中,我不太确定 ProductId 属性是否包含产品名称。如果不是这样,可以在 LINQ 查询的第二行轻松更改。

        【讨论】:

          猜你喜欢
          • 2010-11-25
          • 2011-06-13
          • 1970-01-01
          • 2012-01-20
          • 2012-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-05
          相关资源
          最近更新 更多