2017-08-02 58 views
0

無法弄清楚下面的代碼和數據有什麼問題。它返回 「的NullReferenceException是未處理」使用SelectSingleNode處理空異常

代碼:

XmlDocument doc = new XmlDocument(); 
doc.Load(Filename1); 

XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable); 
mgr.AddNamespace("temp","http://www.Rahiman.com"); 

string name1 = doc.SelectSingleNode("//temp:Company/temp:Businesscard[2]/temp:Name", mgr). 
    InnerText; 

Console.WriteLine(name1); 

數據文件:

<?xml version="1.0" encoding="utf-8" ?> 
<Company  xmlns="http://www.Rahiman.com"> 
    <![CDATA[This data file is created as part of 1st BizTalk example]]> 
    <Businesscard> 
    <name> Rahiman </name> 
    <Phone Category="Mobile">+91 900028xxxx</Phone> 
    <Phone Category="Land">+91 40-40020xxxx</Phone> 
    <Phone Category="Fax">+91 900028xxxx</Phone> 
    <Email>[email protected]</Email> 
    </Businesscard> 
    <Businesscard> 
    <name>Shaik </name> 
    <Phone Category="Mobile">+91 900028xxxx</Phone> 
    <Phone Category="Land">+91 40-40020xxxx</Phone> 
    <Phone Category="Fax">+91 900028xxxx</Phone> 
    <Email>[email protected]</Email> 
    </Businesscard> 
</Company > 

我已經試過

string name1 = doc.DocumentElement.SelectSingleNode("//temp:Company/temp:Businesscard[2]/temp:Name", mgr). 
    InnerText; 

以及

感謝。

+0

雖然我明白技術上所有關於NullRef異常的問題都可以標記爲重複的原因,nullref可能發生的原因是多種多樣的,並且通常是「需要第二雙眼睛」方面的請求,不一定是正在尋找的空引用本身。因此,引導一個通用的建議(實際上,就像我在我的答案中給出的)不會像Gilad指出的那樣有助於爲什麼null出現 –

+0

@CaiusJard StackOverflow不是一個調試服務但是。事實上,在閱讀鏈接副本之後,OP很可能會理解錯誤意味着什麼,以及如何調試它。如果事實證明圖書​​館不正確地返回null,當它不應該時,那麼這是一個完全不同的問題,並且可以像這樣發佈。 – Rob

+0

我部分接受這個觀點,但本網站幾乎所有問題都屬於兩類:「我該如何做X」和「這是我如何做X的破解,請幫助解決」。在前者的情況下,提問者因爲沒有付出任何努力而受到重創,也許這很公平。在後者的情況下,我們不能用「我們不存在調試代碼」的方式來開始錘擊它們;每個人都需要一點時間幫助他們理解編譯器和運行時錯誤消息在他們早期職業生涯中的某些時刻的複雜性,有時候原因很微妙,很容易錯過。 –

回答

0

那麼,它不可能是doc爲空,所以它必須是方法調用爲空的SelectSingleNode的結果。直到你確定它不是指的.InnerText 屬性不爲null:

string name1; 
var n = doc.DocumentElement.SelectSingleNode("//temp:Company/temp:Businesscard[2]/temp:Name", mgr); 
if(n!=null) 
    name1 = n.InnerText; 
2

當檢索Name標籤是大小寫敏感的,所以應該是name

"//temp:Company/temp:Businesscard[2]/temp:name" 

你也可以使用?.零傳播:

string name1 = doc.SelectSingleNode("//temp:Company/temp:Businesscard[2]/temp:name", mgr)?.InnerText; 
+0

注意,當然,我們不確定他是否使用c#6,但如果他以前沒有遇到過這種語法,那麼這是一個方便的提示。欲瞭解更多信息穀歌「C#6空傳播」。 (我不是downvorer;我認爲你的建議在這裏非常出色,所以我沒有問題可以用uv取消那個dv。讓我們來看看是否有任何dver的反饋) –

+0

@CaiusJard - true,但無論如何問題不在於訪問內部文本,而是使用了xpath - 名稱與名稱「 –

+0

」但索引從0開始......不,這是xpath查詢,索引是基於1的。 –