检查动态元素中的null

时间:2014-06-17 16:27:01

标签: c# asp.net-mvc-4 xml-parsing

我正在将一个字符串加载到一个xml元素中并且已经设置了我认为适当的错误检查,但是如果某个特定的xml节点不存在它仍然会抛出错误

StackTrace "at System.Linq.Enumerable.First[TSource](IEnumerable`1 source)\r\n 
at MvcApplication1.Controllers.MyController.MySearch(SearchModel s)
in c:\\...Controller.cs:line 2900" string e {"Sequence contains no elements"}   
System.Exception {System.InvalidOperationException}

如果这不是检查节点是否存在的正确方法,那是什么?请提前通知和thanx。

      XmlDocument doc = new XmlDocument();
            doc.LoadXml(mytextstring);
            XDocument docx = DocumentToXDocumentReader(doc);
    ...
            try
            {
                foreach (XElement xe in docx.Descendants("RootElement"))
                {

                    MySearchModel jbcs = new MySearchModel();

                    jbcs.ID = xe.Attribute("SID").Value;                        
                    ...
                    jbcs.FirstName = (xe.Element("PersonalData").Element("Name").Element("First") == null) ? "" : 
                    xe.Element("PersonalData").Element("Name").Element("First").Value.Trim();

                    jbcs.LastName = (xe.Element("PersonalData").Element("Name").Element("Last") == null) ? "" :
                    xe.Element("PersonalData").Element("Name").Element("Last").Value.Trim();  

                    jbcs.HomeLocation = (xe.Element("PersonalData").Element("Address").Element("Location") == null) ? "" :
                    xe.Element("PersonalData").Element("Address").Element("Location").Value.Trim(); 
        ...
       }
    }

这也不起作用:

jbcs.FirstName = (xe.Element("PersonalData").Element("Name").Element("First").Equals(null)) ? ...

1 个答案:

答案 0 :(得分:0)

不得不稍微修改一下:

bool hasCompany = xe.Element("Experiences").DescendantsAndSelf("Experience").Descendants("Company").Any();
jbcs.RecentEmployer = (hasCompany ? xe.Element("Experiences").DescendantsAndSelf("Experience").Descendants("Company").First().Value.Trim() : "");
bool hasJobTitle = xe.Element("Experiences").DescendantsAndSelf("Experience").DescendantsAndSelf("Job").Descendants("Title").Any();
jbcs.RecentJobTitle = (hasJobTitle ? xe.Element("Experiences").Element("Experience").DescendantsAndSelf("Job").Descendants("Title").First().Value.Trim() : "" );

不知道这是不是最好的方法,但它确实有用。