2009-07-20 45 views
1

假設我有以下XML數據:的LINQ to XML:複雜的查詢求助

<?xml version="1.0" encoding="utf-8" ?> 
<Accounts> 
    <Account name="Account1"> 
     <Campaign name="Camp1"> 
      <RemoteCampaign>RC1</RemoteCampaign> 
      <RemoteCampaign>RC2</RemoteCampaign> 
     </Campaign> 
     <Campaign name="Camp2"> 
      <RemoteCampaign>RC3</RemoteCampaign> 
     </Campaign> 

    </Account> 
    <Account name="Account2"> 
     <Campaign name="Camp3"> 
      <RemoteCampaign>RC4</RemoteCampaign> 
     </Campaign> 
     <Campaign name="Camp4"> 
      <RemoteCampaign>RC5</RemoteCampaign> 
     </Campaign> 

    </Account> 
</Accounts> 

我需要確定給定的帳戶和遠程廣告活動的名稱系列名稱。有沒有一種簡單的方法可以在Linq to Xml中執行此操作?可以假定所有值都是唯一的。

回答

2

下可以工作:

var query = from aa in xdoc.Descendants("Account") 
      where aa.Attribute("name") != null 
        && aa.Attribute("name").Value == accountName 
      from cc in aa.Descendants("Campaign") 
      where cc.Attribute("name") != null 
        && cc.Descendants("RemoteCampaign").Any(elt => elt.Value == remoteName) 
      select cc.Attribute("name").Value; 
0
public static string GetCampaignName(string xml, string accountName, string rcName) 
{ 
    return XDocument.Parse(xml).Descendants("Account") 
     .Where(a => string.Equals(a.Attribute("name").Value,accountName)).Descendants("Campaign") 
     .Where(c => c.Descendants("RemoteCampaign").Select(rc => rc.Value).Contains(rcName)) 
     .First().Attribute("name").Value; 
} 

上述功能假定每個活動都會有一個名字雖然,要不然NullReferenceException將被拋出;因此,如果您認爲並非所有廣告系列都會有名稱,請將其拆分並檢查是否有空值。

0

這工作,但可能不是最有效的:

 XDocument xml = XDocument.Load(Server.MapPath("XMLFile.xml")); 
    string account = "Account1"; 
    string remoteCampaign = "RC1"; 
    string campaign = xml.Descendants() 
     .Where(rc => rc.Value == remoteCampaign && rc.Ancestors("Account").Any(a => a.Attribute("name").Value == account)) 
     .Where(n => n.Parent.Name == "Campaign") 
     .Select(c => c.Parent.Attribute("name").Value).FirstOrDefault();