0

I am writing a C# code to parse the following XML doc :

<?xml version="1.0" encoding="utf-8" ?> 
<teams>
  <team id="1">
    <name>RealMadrid</name>
    <players>
      <player id="1" role="Forward">
        <firstname>Cristiano</firstname>
        <lastname>Ronaldo</lastname>
        <number>7</number>
      </player>
      <player id="2" role="Forward">
        <firstname>Gareth</firstname>
        <lastname>Bale</lastname>
        <number>11</number>
      </player>
      <player id="3" role="Midfield">
        <firstname>Toni</firstname>
        <lastname>Kroos</lastname>
        <number>8</number>
      </player>
      <player id="4" role="Midfield">
        <firstname>Luka</firstname>
        <lastname>Modric</lastname>
        <number>19</number>
      </player>
      <player id="5" role="Defence">
        <firstname>Sergio</firstname>
        <lastname>Ramos</lastname>
        <number>4</number>
      </player>
      <player id="6" role="Defence">
        <firstname>Raphael</firstname>
        <lastname>Varane</lastname>
        <number>2</number>
      </player>
      <player id="7" role="Goalkeeper">
        <firstname>Keylor</firstname>
        <lastname>Navas</lastname>
        <number>1</number>
      </player>
    </players>
  </team>
  
    
    
  <team id="2">
    <name>Barcelona</name>
    <players>
      <player id="1" role="Forward">
        <firstname>Lionel</firstname>
        <lastname>Messi</lastname>
        <number>10</number>
      </player>
      <player id="2" role="Forward">
        <firstname>Neymar</firstname>
        <lastname>Jr.</lastname>
        <number>11</number>
      </player>
      <player id="3" role="Midfield">
        <firstname>Ivan</firstname>
        <lastname>Rakitic</lastname>
        <number>4</number>
      </player>
      <player id="4" role="Midfield">
        <firstname>Andres</firstname>
        <lastname>Iniesta</lastname>
        <number>8</number>
      </player>
      <player id="5" role="Defence">
        <firstname>Gerard</firstname>
        <lastname>Pique</lastname>
        <number>3</number>
      </player>
      <player id="6" role="Defence">
        <firstname>Javier</firstname>
        <lastname>Mascherano</lastname>
        <number>14</number>
      </player>
      <player id="7" role="Goalkeeper">
        <firstname>Andre</firstname>
        <lastname>Ter Stegen</lastname>
        <number>1</number>
      </player>
    </players>
  </team>
  
    
    
      
  <team id="3">
    <name>Liverpool</name>
    <players>
      <player id="1" role="Forward">
        <firstname>Daniel</firstname>
        <lastname>Sturridge</lastname>
        <number>15</number>
      </player>
      <player id="2" role="Forward">
        <firstname>Roberto</firstname>
        <lastname>Firmino</lastname>
        <number>11</number>
      </player>
      <player id="3" role="Midfield">
        <firstname>Philippe</firstname>
        <lastname>Coutinho</lastname>
        <number>10</number>
      </player>
      <player id="4" role="Midfield">
        <firstname>Adam</firstname>
        <lastname>Lallana</lastname>
        <number>20</number>
      </player>
      <player id="5" role="Defence">
        <firstname>Joel</firstname>
        <lastname>Matip</lastname>
        <number>32</number>
      </player>
      <player id="6" role="Defence">
        <firstname>Dejan</firstname>
        <lastname>Lovren</lastname>
        <number>6</number>
      </player>
      <player id="7" role="Goalkeeper">
        <firstname>Simon</firstname>
        <lastname>Mignolet</lastname>
        <number>22</number>
      </player>
    </players>
  </team>
</teams>

I want to write the firstname and lastname for players of a specific team. I wrote the following code :

var realTeam = from db in xelement.Elements("team")
                       where (string)db.Element("name")=="RealMadrid"
                       select db;
        //Console.WriteLine("Real Madrid");
        foreach (var e in realTeam)
        {
            Console.WriteLine(e);
        }

This code is giving all the xml part related to "RealMadrid". What should I do write on the firstname and lastname of this part?

Any help is appreciated!!

3
  • You're selecting the name element. Try select db.Elements("players"); instead of select db; then iterate through the players, each element should be of type player which has lastname and firstname. Commented Jun 20, 2017 at 6:23
  • @KeyurPATEL I tried your solution and I only got the following message in the Console : System.Xml.Linq.XContainer+<GetElements>d__40 Commented Jun 20, 2017 at 6:27
  • RoyNasr please mark @feal answers as accepted. if his solution worked for you. Commented Jun 20, 2017 at 19:02

2 Answers 2

1

Do it like this:

  var xmlContent = "YOUR XML";
  var xmlDoc = XDocument.Parse(xmlContent);
  var realTeamName = "RealMadrid";

  var realTeam = from team in xmlDoc.Elements("teams")
                                    .Descendants("team")
                 where team.Element("name").Value == realTeamName
                 select team;

  var players = realTeam.Elements("players").Elements(); // get players
  foreach (var player in players)                        // iterate over players
  {
    Console.WriteLine("First name: " + player.Element("firstname").Value);
    Console.WriteLine("Last name: " + player.Element("lastname").Value);
  }

So far you've got the team, but now you need to step into the team elements to get the players list and then the single player with firstname, lastname....

Sign up to request clarification or add additional context in comments.

6 Comments

When I execute this code I get the following exception on "var xmlDoc = XDocument.Parse(xmlContent);" : "System.Xml.XmlException: 'Data at the root level is invalid. Line 1, position 1.'"
did you fill the variable xmlContent with your real xmlContent? Because in this example the xmlContent variable contains "Your Xml" which is of course not valid.
Yes I wrote like this : var xmlContent = "..\\..\\XMLFile1.xml"; where my xml file name is : XMLFile1.xml
Ok there is the error: You need to load the filecontent first: so use var xmlContent = System.IO.File.ReadAllText("..\\..\\XMLFile1.xml");
Try XmlDocument doc = new XmlDocument(); doc.Load("path to your file"); string xmlContent = doc.InnerXml;.
|
0

As I mentioned in my comment, you're not selecting the players element in your statement. Try the following:

var realTeam = from db in xelement.Elements("team")
               where (string)db.Element("name")=="RealMadrid"
               select db.Elements("players");
//Console.WriteLine("Real Madrid");
if (realTeam.Count() != 1)
{
    //more than 1 team called RealMadrid was found, handle this case here
    return;
}
foreach (var e in realTeam.Single())
{
    Console.WriteLine("First Name: " + e.Element("firstname").Value);  //or e.Element("firstname").ToString()
    Console.WriteLine("Last Name: " + e.Element("lastname").Value);
}

6 Comments

Thx you for your help, but I copy pasted your code and replaced mine with it, and I got the following error on "e.Element" in the Console.WriteLine statement : 'IEnumerable <XElement>' does not contain a definition for 'Element' and no extension method 'Element' accepting a first argument of type ''IEnumerable <XElement>' could be found.
Ah I think I was missing a .Elements(), see the edit. (feal's answer helped)
this solution still does not compile
There's another error on the realTeam.Elements() part :P
I realized why, there could be multiple teams named "RealMadrid". I will edit my code.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.