0

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();
dbc
  • 104,963
  • 20
  • 228
  • 340
NewUnhandledException
  • 733
  • 2
  • 10
  • 34
  • 1
    I have edited your title. Please see, "[Should questions include “tags” in their titles?](http://meta.stackexchange.com/questions/19190/)", where the consensus is "no, they should not". – John Saunders May 11 '15 at 16:24
  • possible duplicate of [What is a NullReferenceException and how do I fix it?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) – Chuck Savage May 11 '15 at 17:16

2 Answers2

1

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);
     }
Jonesopolis
  • 25,034
  • 12
  • 68
  • 112
1

You can use sequences rather than leaving the IEnumerable immediately:

var value = (string)p.Elements("Sponsor")
    .Elements("aItem")
    .Elements("AmendText")
    .Elements("Page")
    .SingleOrDefault()
Charles Mager
  • 25,735
  • 2
  • 35
  • 45