使用LINQ to XML时检查缺少的元素

时间:2015-05-11 16:22:17

标签: c# xml linq

我正在尝试从xml获取数据。下面是代码 从XDocument获取数据并返回list<t>

但是,p.Element("Sponsor")有时可能为空。如何检查空值

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();

2 个答案:

答案 0 :(得分:1)

将代码移出对象初始值设定项,并为其添加一些逻辑:

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);
     }

答案 1 :(得分:1)

您可以使用序列而不是立即离开IEnumerable

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