使用c#将属性附加到xml中的元素时出现NullReferenceException

时间:2010-12-05 01:05:33

标签: c# xml nullreferenceexception xpath selectsinglenode

在尝试将元素追加到元素的父元素时,我得到一个NullReferenceException,如下所示

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作为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>

2 个答案:

答案 0 :(得分:2)

SelectSingleNode程序将返回null,因为找不到gameId:

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

因此existingGamenull,因此在调用时会抛出NullReferenceException

existingGame.AppendChild(newPlayer);

你必须像这样逃避游戏:

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

更简单的属性方法,XmlElement更具体 但除非你不能用XmlElement ...

,否则你不应该试着不要更通用
var existingGame = (XmlElement) doc.DocumentElement.SelectSingleNode("...");

existingGame.SetAttribute("id", gameId);

答案 1 :(得分:0)

您是否检查过existingGame和newPlayer都是非空的?我猜测SelectSingleNode找不到任何东西并返回null。 (我不认为newPlayer可能为null,但请查看以防万一。)