2013-01-20 40 views
0

我已經寫了一個c#函數來解析XML流。 我的XML可以有幾個節點。在XML解析中沒有nullReferenceException

例子:

<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只有節點「Two」,我會得到一個NullReferenceException

有沒有辦法避免這個異常(我不能改變我的流)。

感謝很多:)

+0

我認爲這個問題的答案將幫助您 - http://stackoverflow.com/questions/2630192/c-sharp-check-an - 元素-存在,使用時 - - LINQ到XML。基本上你必須在嘗試引用它們的值之前檢查是否存在缺少的'Element's。 –

回答

1

您應該檢查是否item.Element("anything")null在訪問它的Value財產之前。

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

非常感謝:)這是完美的 –

1

你需要做的:

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

.Element(String)回報null如果您請求的名稱的元素不存在。

檢查值!= ""是否毫無意義,因爲您正在阻止的是將空字符串重新分配給strOne變量,該變量已經是空字符串。另外,如果您確實需要執行空字符串檢查,則使用String.IsNullOrEmpty(String)方法是首選方法。

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;