2013-03-27 4 views
0

Я пытаюсь выяснить, как сделать оператор select, используя linq для xml. Я хотел бы вернуть ServerTypes, если DeploymentType соответствует определенному значению (Enterprise9999).Linq to xml Выбрать оператор

XML:

<Deployments> 
    <Deployment> 
    <DeploymentType>Enterprise9999</EnterpriseDeploymentType> 
    <Servers> 
     <DeploymentServer> 
     <ServerType>WindowsServer</ServerType> 
     </DeploymentServer> 
     <DeploymentServer> 
     <ServerType>LinuxServer</ServerType> 
     </DeploymentServer> 
    </Servers> 
    </Deployment> 
    <Deployment></Deployment> 
    <Deployment></Deployment> 
</Deployments> 

Вот то, что я до сих пор в коде. Я уверен, что я ошибаюсь в этом:

XDocument xmlDoc = XDocument.Load(@xmlFile); 
IEnumerable<XElement> xlDeployments = from depRows in xmlDoc.Descendants("Deployments") 
              select depRows; 

var deploy = xlDeployments.Descendants("Deployment"); 

foreach (var dep in deploy) 
{ 
    if (dep.Element("DeploymentType").ToString() == "Enterprise9999") 
    { 
     MessageBox.Show(dep.Elements("ServerType").ToString()); 
    } 
} 

Является ли пространство имен необходимым для оператора выбора?

+3

Ваш XML не очень хорошо образован – DGibbs

+1

частности, закрывающий тег этого тега не соответствует открывающему тегу: Enterprise9999

ответ

2

Я изменил вы тег </EnterpriseDeploymentType> к </DeploymentType>

XDocument xmlDoc = XDocument.Load(@xmlFile); 

var deployments = xmlDoc.Descendants("Deployment") 
         .Where(dep => dep.Element("DeploymentType") != null 
            && dep.Element("DeploymentType").Value == "Enterprise9999"); 

var servers = deployments.Descendants("ServerType") 
         .Select(node => node.Value); 

Console.WriteLine(string.Join(Environment.NewLine, servers)); 

принтов:

WindowsServer 
LinuxServer 
+0

Хороший улов на вмещающей теге, я был пытаясь очистить его и пропустил. Это отлично поработало. Спасибо. – Sparhawk

1

Предполагая, что вы исправили XML в соответствии с моим комментарием, вы можете использовать следующий сингл запрос: -

var nodes = from n in xml.Descendants("DeploymentType") 
        .Where(x => x.Element("EnterpriseDeploymentType").Value.Equals("Enterprise9999")) 
         select n.Descendants("Servers").Descendants("ServerType").Select(s => s.Value); 

Что даст вам:

WindowsServer LinuxServer

+0

Спасибо за помощь, я буду играть с однолинейным подходом. :) – Sparhawk