在尝试将元素追加到元素的父元素时,我得到一个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>
答案 0 :(得分:2)
SelectSingleNode
程序将返回null
,因为找不到gameId:
dartDatabase.DocumentElement.SelectSingleNode("/games/game[@id='gameId']");
因此existingGame
为null
,因此在调用时会抛出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,但请查看以防万一。)