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 にクエリを実行して、の値と一致する属性値をProductReceipt持つ要素があるかどうかを確認するにはどうすればよいですか?ProductIdproductName

ご協力ありがとうございました!

4

3 に答える 3

1

要素と属性がそこにあることが常にわかっている場合は、次のようにしてみてください。

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

要素と属性が欠落している可能性がある場合は、各ステップで SingleOrDefault と null チェックを実行できます

于 2012-11-24T13:11:41.947 に答える
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メソッドは指定された名前の属性のシーケンスを返します。ProductIdあなたが提供した XML の例から、属性が製品の名前を保持するかどうかはよくわかりません。そうでない場合は、LINQ クエリの 2 行目で簡単に変更できます。

于 2012-11-24T13:22:50.930 に答える
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 に答える