2009-07-20 14 views
1

は、私は、次のXMLデータがあるとします。のLINQ:複雑なクエリのヘルプ

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