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として追加しようとしました。また、要素newElementに属性newPlayerIdを追加すると、NullReferenceExceptionが発生します。最初の部分は問題なく機能し、次のようなxmlファイルを作成します。

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

しかし、2番目の部分は、属性IDで決定する特定の要素にnewPlayer要素を追加しようとしたときです。

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が見つからなかったため、プロシージャが返されますSelectSingleNodenull

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

したがって、次のように呼び出すと、がスローされますexistingGamenullNullReferenceException

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

既存のゲームとnewPlayerが両方ともnullでないことを確認しましたか?SelectSingleNode何も見つからず、nullを返したと思います。(newPlayerがnullになる可能性はないと思いますが、念のため確認してください。)

于 2010-12-05T01:16:45.390 に答える