0

我编写了 ac# 函数来解析 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、2 和 3),就没有问题!但是,如果我的 Stream 只有节点“Two”,我会得到一个NullReferenceException.

有没有办法避免这个异常(我不能改变我的流)。

非常感谢 :)

4

3 回答 3

1

你需要做:

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

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

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

于 2013-01-20T11:58:19.007 回答
1

您应该在访问它的属性之前检查是否item.Element("anything")是。nullValue

if (item.Element("Three") != null && item.Element("Three").Value != "")
于 2013-01-20T12:02:27.777 回答
1

而不是访问属性(如您所知,如果元素不存在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;
于 2013-01-20T12:36:24.700 回答