2012-11-24 53 views
0

我正在使用店內購買的Windows應用商店應用。進行購買時,返回一些XML。我試圖查看用戶是否成功購買了該產品。我知道我可以用LINQ來確定這一點,但我不確定如何編寫我的LINQ查詢。使用LINQ解析收據XML

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,看看是否有是有,在productName值相匹配的ProductId屬性值ProductReceipt元素?

謝謝你的幫助!

回答

1

嘗試這樣的,如果你總是知道的元素和屬性將在那裏:

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

如果元素和屬性可以丟失,你可以做的SingleOrDefault和空檢查每個步驟

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); 
} 
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查詢的第二行中輕鬆更改。