简单的XML解析会抛出对象引用错误

时间:2013-11-27 18:46:52

标签: xml vb.net linq linq-to-xml

如何解析以下XML文件?

<Website.com xmlns="">
  <Matc>
    <Id>1</Id>
    <Date>2013-11-27T18:00:00+01:00</Date>
    <Home>Moscow</Home>
  </Matc>
  <Matc>
    <Id>2</Id>
  </Matc>
</Website.com>

我尝试了以下代码,但由于Object reference not set to an instance of an object[Date]在XML文件的第二部分缺失,因此会引发Home错误。

 Dim ns As XNamespace = ""
 Dim matcFromXml = From m In xDoc.Descendants("Matc") Select New With { _
   .Id = IIf(m.Element(ns + "Id") Is Nothing, 0, m.Descendants(ns + "Id").FirstOrDefault().Value), _
   .[Date] = IIf(m.Element(ns + "Date") Is Nothing, DateTime.Now, UtcToDateTime(m.Descendants(ns + "Date").FirstOrDefault().Value)), _
   .Home = IIf(m.Element(ns + "Home") Is Nothing, "", m.Descendants(ns + "Home").FirstOrDefault().Value)}

我该如何解决?我在这做错了什么?

1 个答案:

答案 0 :(得分:1)

强烈建议您将XElement转换为IntegerDateTime?,而不是阅读Value属性,正是出于这个原因。另外,请考虑使用If合并运算符。

Dim matcFromXml = From m In xDoc.Descendants("Matc") Select New With { _
    .Id = CInt(m.Descendants(ns + "Id").FirstOrDefault()),
    .[Date] = If(CType(m.Descendants(ns + "Date").FirstOrDefault(), Date?), DateTime.Now),
    .Home = If(CStr(m.Descendants(ns + "Home").FirstOrDefault()),"")}

如果没有Id元素,则对CInt使用普通Id会导致错误。相反,请使用IfCType

    .Id = If(CType(m.Descendants(ns + "Id").FirstOrDefault(),Integer?),0),