Max
Max

Reputation: 1299

Trying to read XML attributes via LINQ

xDoc variable loads the XML content but I am not able to retrieve any information. It comes back NULL:

var xDoc = XDocument.Load(Config.CredentialFileName);

//method 1
IEnumerable<XElement> rows = from row in xDoc.Descendants("domain")
                             where (string)row.Attribute("name") == "TEST"
                             select row;
//method 2
var list = xDoc.Descendants("domain")
    .Select(d => new
    {
        name = d.Attribute("name").Value,
        username = d.Attribute("username").Value,
        password = d.Attribute("password").Value //,
    })
    .Where(a => a.name == "TEST")
    .ToList();

XML file:

<domains>
  <domain name="TEST" userName="test" password="tSEvmlsmwEkjSxUwrCVf3G6"/>
</domains>

Thank you

Upvotes: 1

Views: 682

Answers (2)

Sergey Berezovskiy
Sergey Berezovskiy

Reputation: 236188

Your first method works just fine with xml you provided. Make sure you are parsing xml with exactly same structure. Also check that you have at least one domain element with name equal to TEST. And make sure you don't have namespaces defined in your xml.

Second method has typo in userName attribute name (you have lower case username):

var list = xDoc.Descendants("domain")
                .Select(d => new {
                    name = d.Attribute("name").Value,
                    username = d.Attribute("userName").Value, // <-- typo here
                    password = d.Attribute("password").Value
                })
                .Where(a => a.name == "TEST")
                .ToList();

Also, I'd recommend to use casting instead of reading node Value property, because getting this property will throw an exception if node not exist.

var domains = from d in xDoc.Descendants("domain")
              let name = (string)d.Attribute("name")
              where name == "TEST"
              select new {
                  Name = name,
                  Username = (string)d.Attribute("userName"),
                  Password = (string)d.Attribute("password")
              };

Upvotes: 1

scartag
scartag

Reputation: 17680

See below.

  var xDoc= XElement.Load(Config.CredentialFileName);             

var result =  xDoc.Elements("domain").Where(x => x.Attribute("name").Value.Equals("TEST")).ToList();

Upvotes: 0

Related Questions