0

我正在开发一个使用店内购买的 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 以查看是否存在具有与 in 中的值匹配的属性值的ProductReceipt元素?ProductIdproductName

感谢您的帮助!

4

3 回答 3

1

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

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

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

于 2012-11-24T13:11:41.947 回答
0

假设您的产品名称在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);
}
于 2012-11-24T13:12:27.393 回答
0

试试这个:

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 查询的第二行轻松更改。

于 2012-11-24T13:22:50.930 回答