NewUnhandledException
NewUnhandledException

Reputation: 743

Check for missing elements while using LINQ to XML

I am trying get data from the xml. Below is the code which gets data from the XDocument and return list<t>.

However, p.Element("Sponsor") can sometimes be null. How can I check for the null values

var atClauseList = doc.Descendants(CLAUSE_GROUP_TAG).Descendants(AT_CLAUSE_TAG).Select(p => new AtClause()
            {
                ClauseNumber = (string)p.Element("Number"),
                Sponsors = p.Element("Sponsor").Elements(SPONSOR_TAG).Select(y => y.Value)
                                       .ToList(),
                Page = p.Element("Sponsor").Element("aItem").Element("AmendText").Element("Page").ElementValueNull(),
                Line = p.Element("Sponsor").Element("aItem").Element("AmendText").Element("Line").ElementValueNull(),
                LineText = p.Element("Sponsor").Element("aItem").Element("AmendText").Nodes().OfType<XText>().FirstOrDefault().XTextValueNull(),
                ItalicText = p.Element("Sponsor").Element("aItem").Element("AmendText").Element("Italic").ElementValueNull(),
                ParaList = p.Element("Sponsor").Element("aItem").Element("AmendText").Elements("Para").Select(L => new Para
                    {
                        ParaText = (string)L,
                        Number = ((System.Xml.Linq.XElement)(L)).AttributeValueNull("Number"),
                        Quote = ((System.Xml.Linq.XElement)(L)).AttributeValueNull("Quote"),
                    }
                    ).ToList()
            }).ToList();

Upvotes: 0

Views: 592

Answers (2)

Charles Mager
Charles Mager

Reputation: 26213

You can use sequences rather than leaving the IEnumerable immediately:

var value = (string)p.Elements("Sponsor")
    .Elements("aItem")
    .Elements("AmendText")
    .Elements("Page")
    .SingleOrDefault()

Upvotes: 1

Jonesopolis
Jonesopolis

Reputation: 25370

move your code out of an object initializer, and add some logic to it:

var atClauseList = new List<AtClause>();

foreach(var item in doc.Descendants(CLAUSE_GROUP_TAG).Descendants(AT_CLAUSE_TAG))
{
    var atClause = new AtClause();

    atClause.ClauseNumber = (string)item.Element("Number");

    var sponsor = item.Element("Sponsor");

    if (sponsor != null)
    {
           atClause.Sponsors = sponsor.Elements(SPONSOR_TAG).Select(y => y.Value).ToList();
           atClause.Page = sponsor.Element("aItem").Element("AmendText").Element("Page").ElementValueNull();
           atClause.Line = sponsor.Element("aItem").Element("AmendText").Element("Line").ElementValueNull();
           atClause.LineText = sponsor.Element("aItem").Element("AmendText").Nodes().OfType<XText>().FirstOrDefault().XTextValueNull();
           atClause.ItalicText = sponsor.Element("aItem").Element("AmendText").Element("Italic").ElementValueNull();
           atClause.ParaList = sponsor.Element("aItem").Element("AmendText").Elements("Para").Select(L => new Para
           {
                ParaText = (string)L,
                Number = ((System.Xml.Linq.XElement)(L)).AttributeValueNull("Number"),
                Quote = ((System.Xml.Linq.XElement)(L)).AttributeValueNull("Quote"),
           }).ToList();


           atClauseList.Add(atClause);
     }

Upvotes: 1

Related Questions