Tom Gullen
Tom Gullen

Reputation: 61725

Linq to XML retrieve single node

I have the following XML:

<?xml version="1.0" encoding="UTF-8"?>
<game>
    <name>Space Blaster</name>
    <description></description>
    <version>1</version>
    <fullscreen>false</fullscreen>
    <width>640</width>
    <height>640</height>
    <c2release>6900</c2release>
</game>

It's guaranteed to only have 1 game record in it. I'd like to retrieve each property value, this is what I've tried:

string ArcadeXMLLocation = Settings.GamePergatoryLocation + UserID + "/unzipped/arcade.xml";
XDocument loaded = XDocument.Load(ArcadeXMLLocation);

var q = (from c in loaded.Descendants("game") select (string)c.Element("name")).SingleOrDefault();
Response.Write(q.name);

But I can't seem to take any values like this (intellisense hates it!) Can someone show me how it's done?

Upvotes: 0

Views: 8324

Answers (4)

James Johnson
James Johnson

Reputation: 46047

I think you just need to get the value of the element:

string val = doc.Descendants("game")
    .Select(x => x.Element("name").Value).FirstOrDefault();

As a prerequisite to the above, and so intellisense picks it up, make sure that you import the System.Linq and System.Xml.Linq namespaces.

Upvotes: 2

esskar
esskar

Reputation: 10940

var q = (from c in loaded.Descendants("game") select (string)c.Element("name")).SingleOrDefault();
Console.WriteLine(q);

is enough. or to avoid the cast

var q = (from c in loaded.Descendants("game") select c.Element("name").Value).SingleOrDefault();
Console.WriteLine(q);

Upvotes: 1

BrokenGlass
BrokenGlass

Reputation: 160922

You query is actually correct (tested and worked for me) for extracting the value of the name node - the (string) cast that you are doing will extract the value of the name node as string and not give you the node object itself, this is one of the shortcuts built into Linq to Xml. All that is left is to print out the name:

Response.Write(q);

Upvotes: 1

Chris
Chris

Reputation: 3162

This will get you all the descendants with the tag "game" You just need the FirstOrDefault() to get the only record if it exists.

             var q = from c in loaded.Descendants("game")
                select new { Name = c.Element("name").Value
                             Description = c.Element("description").Value
                };

             q.FirstOrDefault();

Upvotes: 1

Related Questions