• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 202
  • Last Modified:

Parse XML using LINQ

I have an XML document which has been sent via a web service which I want to parse into an Object using Linq.

My goal is to parse the XML into a LIST of <Job> objects - each jobn has a list or <Patch> objects.  My LINQ query is :-

 
var jobs = (from job in xDocument.Descendants("job")
select new Job()
{
	ID	 = int.Parse(job.Attribute("id").Value),
	Location = job.Attribute("address").Value,
	Postcode = job.Attribute("postcode").Value,
	//
	Patches = (from patch in job.Descendants("patch")
		select new Patch()
		{
		ID	= int.Parse(patch.Attribute("id").Value),
		Depth		= decimal.Parse(patch.Attribute("d").Value),
		}).ToList()
}).ToList();

Open in new window


This seemed to work perfectly until I realised that the 'Depth' fiield for a patch can be "" (an empty string.  This causes the query to fall over as it tries to convert an empty string to a decimal.

Is it possible to add more intelligence to the query to check for this?
0
ChrisMDrew
Asked:
ChrisMDrew
  • 2
1 Solution
 
effesCommented:
You can try this
Depth		= patch.Attribute("d").Value == string.Empty ? 0 : decimal.Parse(patch.Attribute("d").Value),

Open in new window

This assigns 0 to Depth if patch.Attribute("d").Value is an empty string. Otherwise it will parse the value and assign that to Depth.
0
 
ChrisMDrewAuthor Commented:
Thanks - I did try something similar but used the C# syntax of putting brackets around the check - doesn't work in LINQ!  I have a similar problem when a field is not specified at all in the XML - for example in the above query sometimes XML is not specified.  Can I check for an attribute being specified in a similar way?  Maybe

Postcode      = job.Attribute("postcode") == null ? ""  job.Attribute("postcode").Value

or is there a better way?
0
 
effesCommented:
Looks good to me. Just don't forget the colon before the second expression
Postcode      = job.Attribute("postcode") == null ? "" : job.Attribute("postcode").Value

Open in new window


You'll probably want to put that in a method, if you need it a lot. Something along those lines:
private string EvaluateAttribute(XAttribute att)
{
    return att == null ? string.Empty : att.Value;
}

Open in new window

and call it everywhere, where you need a string from an attribute, like in
Postcode      = EvaluateAttribute(job.Attribute("postcode"))

Open in new window

0

Featured Post

NFR key for Veeam Agent for Linux

Veeam is happy to provide a free NFR license for one year.  It allows for the non‑production use and valid for five workstations and two servers. Veeam Agent for Linux is a simple backup tool for your Linux installations, both on‑premises and in the public cloud.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now