Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Retrieve an ancestor attribute

I am attempting to build an external XML config file for several applications, to house their connection strings. The file looks something like this:

<?xml version="1.0" encoding="ISO-8859-1"?>
<configuration>
  <Connection Name = "Primary">
    <Server Name = "DisneyWorld">
      <Database Name ="MagicKingdom">
        <Project Name ="Rides">
          <Login Username="Mickey" Password="Mouse" Encrypted="False"/>
        </Project>
        <Project Name = "Food">
          <Login Username="Goofy" Password="123456" Encrypted="True"/>
        </Project>
        <Project Name ="Shows">
          <Login Username ="Minnie" Password="Mouse" Encrypted="False"/>
        </Project>
      </Database>
    </Server>
    <Server Name = "Epcot">
      <Database Name ="LandOfTomorrow">
        <Project Name = "Innovation">
          <Login Username="Daffy" Password="Duck" Encrypted="False"/>
        </Project>
      </Database>
    </Server>
  </Connection>
</configuration>

There will be a secondary connection, in case the primary one is down. What I am wanting to do is search for Project: Food get its log in information, Database and server. Which I can do with this bit of code:

XDocument doc = XDocument.Load(path);
var query = from connection in doc.Descendants("Connection")
            where connection.Attribute("Name").Value == "Primary"
            from project in connection.Descendants("Project")
            where project.Attribute("Name").Value == targetProject
            select new
            {
                Server = connection.Element("Server").Attribute("Name").Value,
                Database = project.Parent.Attribute("Name").Value,
                UserName = project.Element("Login").Attribute("Username").Value,
                Password = project.Element("Login").Attribute("Password").Value,
                Encrypted = project.Element("Login").Attribute("Password").Value
            };

The code works great, with the exception that it is hard-coded to the current structure. On the lines

Server = connection.Element("Server").Attribute("Name").Value,

and

Database = project.Parent.Attribute("Name").Value,

I would like to be able to get their values, from project.Ancestors("Server"), but I do understand how to achieve this.

like image 479
EZE Avatar asked Aug 08 '26 19:08

EZE


1 Answers

Do you mean something like:

Server = project.Ancestors("Server").Single().Attribute("Name").Value;
Database = project.Ancestors("Database").Single().Attribute("Name").Value;

That's assuming there will only ever be a single ancestor for a given element, of course.

like image 158
Jon Skeet Avatar answered Aug 11 '26 08:08

Jon Skeet



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!