2011-03-31 2 views
0
<?xml version="1.0" encoding="utf-8" ?> 
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > 
    <siteMapNode url="~/" title="Úvodní stránka"> 
     <siteMapNode url="Pocitace" title="Počítače" /> 
     <siteMapNode url="Elektronika" title="Elektronika" /> 
    </siteMapNode> 
</siteMap> 

Et j'écrire dans ce fichier de nouvelles données:XML: référence d'objet non définie à une instance d'un objet

XmlDocument originalXml = new XmlDocument(); 
originalXml.Load(Server.MapPath("../../Web.sitemap")); 
XmlAttribute title = originalXml.CreateAttribute("title"); 
title.Value = newCategory; 
XmlAttribute url = originalXml.CreateAttribute("url"); 
url.Value = seoCategory; 
XmlNode newSub = originalXml.CreateNode(XmlNodeType.Element, "siteMapNode", null); 
newSub.Attributes.Append(title); 
newSub.Attributes.Append(url); 
originalXml.SelectSingleNode("siteMapNode").AppendChild(newSub); 

Mais je reçois:

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object. 
Source Error: 
Line 49: newSub.Attributes.Append(title); 
Line 50: newSub.Attributes.Append(url); 
Line 51: originalXml.SelectSingleNode("siteMapNode").AppendChild(newSub); 

Ligne 51 rouge si. Pouvez-vous m'aider?

(Web.sitemap i ont dans le fichier racine et le code que j'ai en someting/someting/Someting.aspx, donc adrress est correct, je pense.)

+0

Affiche la ** trace de pile d'exception **. – Aliostad

+0

S'il vous plaît vérifier ma solution. Cela fonctionne, je l'ai testé. –

Répondre

1

L'appel à originalXml.SelectSingleNode("siteMapNode") retours null. Vous devez spécifier l'espace de noms.

Mise à jour:
Utilisez ce code au lieu de la ligne qui jette l'exception (Ligne 51):

XmlNamespaceManager nsmanager = new XmlNamespaceManager(originalXml.NameTable); 
nsmanager.AddNamespace("x", "http://schemas.microsoft.com/AspNet/SiteMap-File-1.0"); 
originalXml.SelectSingleNode("x:siteMap/x:siteMapNode", nsmanager).AppendChild(newSub); 

Explication:
Vous avez fait deux erreurs:

  1. Votre XPath requête pour trouver le siteMapNode n'était pas correcte. La façon dont vous l'avez écrit, il a regardé seulement la balise racine pour le tag avec le nom "siteMapNode"
  2. La balise racine "siteMap" spécifie un espace de noms. Vous devez utiliser cet espace de noms dans votre appel à SelectSingleNode
+0

J'ai utilisé ce code au lieu de la ligne 51 et maintenant je n'ai pas d'erreurs, mais dans Web.sitemap isnt nouveau siteMapNode. :-( – John

+0

@John: Parce que vous devez sauvegarder le Xml dans originalXml sur le disque :) –

+0

Oh, originalXml.Save (Server.MapPath ("../../ Web.sitemap")); et maintenant c'est ok. Thx :-) – John

0

Je pense que le xpath que vous donnez au SelectSingleNode est faux et il retournera avec null.

Questions connexes