Don';在XML分析中没有nullReferenceException

本文关键字:nullReferenceException XML Don | 更新日期: 2023-09-27 17:54:48

我编写了一个c#函数来解析XML流。我的XML可以有几个节点。

示例:

<Stream>
 <One>nnn</One>
 <Two>iii</Two>
 <Three>jjj</Three>
</Stream>

但有时,它是:

<Stream>
 <Two>iii</Two>
</Stream>

这是我的c#代码:

var XML = from item in XElement.Parse(strXMLStream).Descendants("Stream") select item;
string strOne = string.Empty;
string strTwo = string.Empty;
string strThree =  string.Empty;
if ((item.Element("One").Value != "")
{
   strOne = item.Element("One").Value;
}
if ((item.Element("Two").Value != "")
{
   strTwo = item.Element("Two").Value;
}
if ((item.Element("Three").Value != "")
{
   strThree = item.Element("Three").Value;
}

有了这段代码,如果我的Stream已满(Node On,Two和three(,就没有问题了!但是,如果我的Stream只有节点"Two",我会得到一个NullReferenceException

有没有办法避免这种异常(我无法更改我的Stream(。

非常感谢:(

Don';在XML分析中没有nullReferenceException

在访问Value属性之前,应检查item.Element("anything")是否为null

if (item.Element("Three") != null && item.Element("Three").Value != "")

您需要做:

if (item.Element("One") != null)
{
   strOne = item.Element("One").Value;
}

如果您请求的名称的元素不存在,.Element(String)将返回null

检查值!= ""是否毫无意义,因为您所阻止的只是将一个空字符串重新分配给strOne变量,该变量已经是空字符串。此外,如果您确实需要进行空字符串检查,使用String.IsNullOrEmpty(String)方法是首选方法。

不访问Value属性(如您所知,如果元素不存在,则会引发NullReferenceException(,而是将元素强制转换为字符串。您可以使用??为不存在的元素提供默认值:

string strOne = (string)item.Element("One") ?? String.Empty;
string strTwo = (string)item.Element("Two") ?? String.Empty;
string strThree =  (string)item.Element("Three") ?? String.Empty;