Majd Sadi
Majd Sadi

Reputation: 49

Linq to Xml C# find specific element inside specific element

I'm trying to return the Degree value of a user with a specific id number, the user can have more than one Degree

my c# code so far (not working) the error: System.InvalidOperationException: 'Sequence contains no matching element'

 public static string checkLicense(string cardType)
        {
            string x="";
            var values = from e in XDocument.Load(@".\data\PersonData.Xml").Elements("User").Single(c => c.Attribute("idNumber").Value == Properties.Settings.Default.idNumber).Descendants("DrivingCardLicence")
                         select e.Element("Degree").Value;

            foreach (var e in values)
            {
                x += e;
            }
            return x;
}

my XML file:

<?xml version="1.0" encoding="utf-8"?>
<Users>
  <User idNumber="666666666">
    <IdCard>
      <FirstName>Majd</FirstName>
      <LastName>sadi</LastName>
      <FatherName>asfasf</FatherName>
      <MotherName>asf</MotherName>
      <GrandFatherName>sdfgasf</GrandFatherName>
      <Sex>זכר</Sex>
      <ImagePath></ImagePath>
      <DateOfBirth>25/06/1996 18:22:48</DateOfBirth>
      <Address>asf</Address>
    </IdCard>
  </User>
  <User idNumber="999999999">
    <IdCard>
      <FirstName>asfasf</FirstName>
      <LastName>asfasf</LastName>
      <FatherName>asfasf</FatherName>
      <MotherName>asfasf</MotherName>
      <GrandFatherName>asfasf</GrandFatherName>
      <Sex>זכר</Sex>
      <ImagePath>C:\Users\m\Desktop\pictures\me\meirl.jpg</ImagePath>
      <DateOfBirth>31/03/1996 18:27:46</DateOfBirth>
      <Address>asfdasf</Address>
    </IdCard>
    <DrivingCardLicence>
      <ImagePath>C:\Users\m\Desktop\pictures\me\IMG_20200214_015706.jpg</ImagePath>
      <imageFilePath>C:\Users\m\Desktop\pictures\2.jfif</imageFilePath>
      <Degree>D1</Degree>
      <Degree>A2</Degree>
      <ReleaseDate>31/03/2020</ReleaseDate>
      <Validation>31/03/2030</Validation>
      <CardNumber>4067510</CardNumber>
    </DrivingCardLicence>
  </User>

note: not all users have DrivingCardLicence element as you can see in xml code, the id=999999999 user have a degree d1 but the id=666666666 user does not so the x should be empty.

Upvotes: 0

Views: 217

Answers (1)

pfx
pfx

Reputation: 23214

You were good on your way with this.

You forgot to include the root element Users via . Element("Users")

var values = 
    from e in doc.Element("Users").Elements("User")
        .Single(c => c.Attribute("idNumber").Value == Properties.Settings.Default.idNumber)
        .Elements("DrivingCardLicence")
        .Elements("Degree")
    select e.Value;

Upvotes: 1

Related Questions