2010-12-05 36 views
1

je reçois un NullReferenceException lorsque vous essayez d'ajouter l'élément à son parent à l'élément, comme celui-ciNullReferenceException lorsque annexant attribut à l'élément en XML en utilisant C#

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); 

.. Il y a probablement une erreur dans l'expression XPath, donc j'ai essayé d'ajouter un élément newPlayer s un lastChild, juste pour essayer le code qui suit. Et là aussi j'obtiens NullReferenceException en ajoutant l'attribut newPlayerId à l'élément newElement. Première partie fonctionne très bien, il crée le fichier xml comme celui-ci,

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

mais la deuxième partie, lorsque je tente d'ajouter l'élément newPlayer à un élément spécifique i par id déterminer attribut.

fichier xml devrait ressembler à ceci

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

'SelectSingleNode ("/ jeux/jeu [@ id = 'gameid']"); '- aucun jeu n'a probablement un gameId égal à" gameId "! 'SelectSingleNode ("/jeux/jeu [@ id = '"+ gameId.ToString() +"'] ")' est plus approprié. –

+0

J'ai essayé comme vous avez écrit, et j'obtiens le même résultat. Et j'ai vérifié existingGame est null, mais newPlayer n'est pas null sa valeur est {Element, player} –

Répondre

2

La procédure SelectSingleNode retournera null comme gameid n'a pas été trouvé:

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

Par conséquent existingGame est null et ainsi le NullReferenceException est jeté lors de l'appel:

existingGame.AppendChild(newPlayer); 

Vous devrez échapper à la gameid comme ceci:

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

Une approche beaucoup plus facile d'attributs, XmlElement est plus spécifique.
Mais vous ne devriez pas essayer de ne pas aller plus générale à moins que vous ne pouvez pas le faire avec XmlElement ...

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

existingGame.SetAttribute("id", gameId); 
+0

Vous avez raison j'ai changé XPath, et il a fait l'affaire, le jeu existant n'est pas nul maintenant. Mais la deuxième partie lance toujours NullReferenceException, lorsque j'essaie d'ajouter l'attribut newPlayerId à newLayer element –

+1

Dans le nom de famille, vous devez permuter newPlayerId et newPlayer. Maintenant, vous ajoutez le noeud à l'attribut, mais vous vouliez ajouter l'attribut au noeud ... –

+1

Pourquoi ne pas simplement déclarer newPlayer comme un objet XmlElement et appeler 'SetAttribute (" id ", playerId.ToString())' il? –

0

Avez-vous vérifié que existingGame et newPlayer sont à la fois non nulle? Je devine que SelectSingleNode n'a rien trouvé et retourné null. (Je ne pense pas qu'il soit possible pour newPlayer d'être nul, mais il faut vérifier au cas où.)

+0

Comme écrit, SelectSingleNode _will_ return null! (la variable gameid n'est pas substituée, le XPATH ne contient que son nom et non sa valeur). – mjv

+0

existingGame est null, et comme vous l'avez dit newPlayer n'est pas nul sa valeur est {Element, player} –