2009-07-20 12 views
1

Supposons que j'ai les données XML suivantes:LINQ to Xml: requête complexe aide

<?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> 

J'ai besoin de déterminer le nom de la campagne quand étant donné le compte et le nom de la campagne à distance. Existe-t-il un moyen facile de faire cela dans Linq à Xml? On peut supposer que toutes les valeurs sont uniques.

Répondre

2

Ce qui suit pourrait fonctionner:

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; 
} 

La fonction ci-dessus suppose que chaque campagne aura un nom bien, ou bien un NullReferenceException sera jeté; Donc, si vous pensez que toutes les campagnes n'auront pas de noms, divisez-les et vérifiez les valeurs nulles.

0

Cela fonctionne, mais peut-être pas la plus efficace:

 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();