1

尝试将元素附加到其父元素到元素时出现 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>
4

2 回答 2

2

由于未找到 gameId,该SelectSingleNode过程将返回:null

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

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

existingGame.AppendChild(newPlayer);

您将不得不像这样逃避gameId:

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

一种更简单的属性方法,XmlElement 更具体。
但是你不应该尝试不去更一般,除非你不能用 XmlElement 来做......

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

existingGame.SetAttribute("id", gameId);
于 2010-12-05T01:23:35.777 回答
0

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

于 2010-12-05T01:16:45.390 回答