2012-11-24 55 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查询的第二行中轻松更改。