NullReferenceException при добавлении атрибута к элементу в XML с помощью c # - PullRequest
1 голос
/ 05 декабря 2010

Я получаю исключение 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, просто чтобы попробовать следующий код.И там я тоже получаю NullReferenceException при добавлении атрибута newPlayerId к элементу newElement.Первая часть работает отлично, она создает 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 ]

2 голосов
/ 05 декабря 2010

Процедура 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);
0 голосов
/ 05 декабря 2010

Вы проверяли, что существующиеGame и newPlayer не равны NULL?Я предполагаю, что SelectSingleNode ничего не нашел и вернул ноль.(Я не думаю, что newPlayer может иметь значение null, но проверьте на всякий случай.)

...