2010-12-05 77 views
1

在XML附加屬性的元素,當我得到一個NullReferenceException當試圖追加元素到其父到元素,這樣的NullReferenceException使用C#

XmlDocument dartDatabase = new XmlDocument(); 
string path = @"D:\xml\dartDatabase.xml"; 

...

dartDatabase.Load(path); 

XmlNode newGame = dartDatabase["games"].AppendChild(dartDatabase.CreateElement("game")); 

XmlNode newGameId = dartDatabase.CreateAttribute("id"); 
newGameId.Value = gameId.ToString(); 
newGame.Attributes.SetNamedItem(newGameId); 

..

XmlNode existingGame = dartDatabase.DocumentElement.SelectSingleNode("/games/game[@id='gameId']"); 
XmlNode newPlayer = dartDatabase.CreateElement("player"); 
existingGame.AppendChild(newPlayer); 
//dartDatabase.DocumentElement.InsertAfter(newPlayer, dartDatabase.DocumentElement.LastChild); 

XmlNode newPlayerId = dartDatabase.CreateAttribute("id"); 
newPlayerId.Value = playerId.ToString(); 
newPlayerId.Attributes.SetNamedItem(newPlayer); 

在XPath表達式中可能有一些錯誤,所以我試圖追加元素newPlayer a是一個lastChild,只是爲了嘗試下面的代碼。當我將newPlayerId附加到元素newElement時,我也得到NullReferenceException。第一部分工作得很好,但像這樣創建XML文件,

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
    <games> 
     <game id="2" name="501" /> 
    </games> 

,但第二部分,當我嘗試newPlayer元素添加到我根據屬性ID的特定元素。

xml文件應該是這樣的

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<games> 
    <game id="2" name="501"> 
    <player id="1"> 
    </player> 
    </game> 
</games> 
+1

'的SelectSingleNode(「/遊戲/遊戲[@ ID =‘遊戲ID’]」); ` - 大概沒有遊戲有gameId等於「gameId」! `SelectSingleNode(「/ games/game [@ id ='」+ gameId.ToString()+「']」);`更合適。 – 2010-12-05 01:16:33

+0

我試着像你寫的,我得到相同的結果。我檢查了existingGame爲null,但newPlayer不爲null,其值爲{Element,player} – 2010-12-05 01:24:04

回答

2

SelectSingleNode過程將返回null作爲遊戲ID一直沒有找到:

dartDatabase.DocumentElement.SelectSingleNode("/games/game[@id='gameId']"); 

因此existingGamenull

existingGame.AppendChild(newPlayer); 

你將不得不逃離這樣的遊戲ID:

0從而調用時 NullReferenceException拋出
SelectSingleNode("/games/game[@id='" + gameId.ToString() + "']"); 

XmlElement更加具體。
但你不應該儘量不要去更一般的,除非你不能XmlElement的做...

var existingGame = (XmlElement) doc.DocumentElement.SelectSingleNode("..."); 

existingGame.SetAttribute("id", gameId); 
0

你檢查existingGame和newPlayer都是非空?我猜SelectSingleNode沒有找到任何東西,並返回null。 (我不認爲這是可能的newPlayer爲空,但如果只是檢查。)

+0

正如所寫,SelectSingleNode _will_將返回null! (gameid變量沒有被替換,XPATH只包含它的名字而不是它的值)。 – mjv 2010-12-05 01:21:50

相關問題