Linq to Xml: справка по сложным запросам - PullRequest
1 голос
/ 20 июля 2009

Предположим, у меня есть следующие данные 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? Можно предположить, что все значения являются уникальными.

Ответы [ 3 ]

2 голосов
/ 21 июля 2009

Может работать следующее:

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 голосов
/ 21 июля 2009

Это работает, но не может быть наиболее эффективным:

        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();
0 голосов
/ 21 июля 2009
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; поэтому, если вы считаете, что не все кампании будут иметь имена, разбейте их и проверьте на наличие нулей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...