Considere o seguinte arquivo xml. Gostaria de obter o ConnectionString
Elemento se eu já tiver o Environment/Name
valor e Application/Name
selecionado de diferentes ComboBoxes
.
<?xml version="1.0" encoding="utf-8" ?>
<Environments>
<Environment>
<Name>DEV</Name>
<Applications>
<Application>
<Name>App1</Name>
<DBType>Oracle</DBType>
<ConnectionString>CS1</ConnectionString>
<Username>user_1</Username>
<Password>pw_1</Password>
</Application>
<Application>
<Name>App2</Name>
<DBType>Oracle</DBType>
<ConnectionString>CS2</ConnectionString>
<Username>user_2</Username>
<Password>pw_2</Password>
</Application>
</Applications>
</Environment>
<Environment>
<Name>TEST 1</Name>
<Applications>
<Application>
<Name>App1</Name>
<DBType>Oracle</DBType>
<ConnectionString>CS3sername>
<Password>pw_3</Password>
</Application>
<Application>
<Name>App2</Name>
<DBType>Oracle</DBType>
<ConnectionString>CS4</ConnectionString>
<Username>user_4</Username>
<Password>pw_4</Password>
</Application>
</Applications>
</Environment>
</Environments>
É isso que tenho no momento, mas não obtive nenhum resultado.
XDocument xDocument = XDocument.Load("Environments.xml");
IEnumerable<XElement> ConnectionString = xDocument
.XPathSelectElements("/Environments/Environment/Applications/Application/ConnectionString")
.Where(x => x.XPathSelectElements("/Environments/Environment/Name").All(x => x.Value.Equals(Environment1ComboBox.SelectedItem))
&& x.XPathSelectElements("/Environments/Environment/Applications/Application/Name").All(x => x.Value.Equals(Application1ComboBox.SelectedItem)))
.ToList();
Eu não usaria XPath para isso, para ser honesto. Eu faria em dois passos para simplificar, um para obter o ambiente, o outro a aplicação dentro dele:
Aqui está outra maneira de usar LINQ para XML usando
Ancestors()
o método .Ele permite ir diretamente ao elemento ConnectionString em uma única instrução enquanto verifica seus valores ancestrais.
c#
Saída