Distinct List of attribute values from XML, using a pre-defined set of attribute names
As long as you don't face noticable performance issues I would chose whatever method seems to be better for you. The XPath works so you may stick to it.

I would however build the path in a more generic way by specifying an array of attribute names first:

var attributeNames = new[]
{
    "billingLocation",
    "adminOffice",
    "homeCity",
    "origin",
    "destination",
    "location",
    "station"
}


and the combining them into a query:

var xPath = string.Join("|", attributeNames.Select(n =&gt; $"//@{n}"));
...xd.SelectNodes(xPath);




In this cas however it is a little bit easier to do the same with linq:

Parse the xml first (which is btw invalid in your example - some elements are not closed):

var xElement = XElement.Parse(text);


Then use the same array for the linq query:

var cities =
    (from attr in xElement.Descendants().Attributes()
     where attributeNames.Contains(attr.Name.LocalName)
     select attr.Value).Distinct();