2009-07-20 2 views
1

Предположим, у меня есть следующий XML-данные:Linq в 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 для 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();