2010-10-12 21 views
2

Je remplis un objet anonyme à partir d'un fichier XML. Jusqu'à présent,Comment puis-je vérifier si ce XElement n'est pas nul avant de l'ajouter à un objet anonyme?

commentary.Elements("Commentator")

a toujours eu une valeur, donc je ne l'ai jamais dû vérifier null. J'ai dû enlever cela cependant, et maintenant il échoue quand il essaye de lire cette ligne.

Je regarde le code et je ne sais pas quoi changer, car il est sélectionné dans une propriété d'un objet anonyme.

var genericOfflineFactsheet = new 
    { 
     Commentary = (from commentary in doc.Elements("Commentary") 
         select new 
         { 
          CommentaryPage = (string)commentary.Attribute("page"), 
          BusinessName = (string)commentary.Attribute("businessName"), 
          Commentator = (from commentator in commentary.Elements("Commentator") 
             select new CommentatorPanel // ASP.NET UserControl 
             { 
              CommentatorName = (string)commentator.Attribute("name"), 
              CommentatorTitle = (string)commentator.Attribute("title"), 
              CommentatorCompany = (string)commentator.Attribute("company") 
             }).FirstOrDefault() 
         }).FirstOrDefault() 

La chose est, je ne peux pas supprimer complètement la ligne parce que parfois commentary.Elements("Commentator")ne ont une valeur. Je suis sûr que cette question a déjà été traitée, mais je ne vois pas quoi faire. Des idées?

+1

Lorsque vous dites échouer, obtenez-vous une erreur ObjRef? – Nix

+0

@Nix, il s'agit d'une exception NullReferenceException – DaveDev

+0

Je ne voulais pas revenir sur le passé, mais je me suis penché à nouveau sur cette question, et êtes-vous sûr qu'il n'y avait pas d'autre problème avec votre code? J'ai juste pris ce que vous aviez, et l'ai passé à travers un test où Commentaire était nul, et ça a bien fonctionné? – Nix

Répondre

2

Ajoutez simplement une vérification nulle. (Code ci-dessous devrait être un bon testeur A un avec et un sans Commentateur.)

XDocument doc = new XDocument(
    new XDeclaration("1.0", "utf-8", "yes"), 
    new XComment("Example"), 
new XElement("Commentarys", 
     new XElement("Commentary", 
      new XAttribute("page", "2"), 
      new XAttribute("businessName", "name"), 
      new XElement("Commentator", 
       new XAttribute("name", "name"), 
       new XAttribute("title", "title") 
      ) 
     ) 
     , 
     new XElement("Commentary", 
      new XAttribute("page", "3"), 
      new XAttribute("businessName", "name2") 

      ) 
    ) 
    ); 
var genericOfflineFactsheet = new 
{ 
    Commentary = (
      from commentary in doc.Elements() 
       .First().Elements("Commentary") 
      select new 
      { 
       CommentaryPage = (string)commentary.Attribute("page"), 
       BusinessName = (string)commentary.Attribute("businessName"), 
       Commentator = (from commentator in commentary.Elements("Commentator") 
          where commentator != null //<-----you need to add this line 
          select new // ASP.NET UserControl 
          { 
           CommentatorName = (string)commentator.Attribute("name"), 
           CommentatorTitle = (string)commentator.Attribute("title"), 
           CommentatorCompany = (string)commentator.Attribute("company") 
          } 

          ).FirstOrDefault() 
      } 
).FirstOrDefault() 
}; 
1

... Untested

Que diriez-vous quelque chose comme:

XElement xe = doc.Elements("Commentary").FirstOrDefault(); 
    Commentary = xe == null ? null : 
    select new { ....snip.... 
1

C'est un cas où je pourrait envisager l'opérateur ?? (coalesce).

null ?? x --> x 

Dans ce cas, vous pourriez obtenir la fusion en un Enumerable vide.

+0

Merci d'avoir signalé l'utilisation d'un Enumerable vide. – Larry

0

J'utilise le? opérateur de cette façon à empêcher un XmlElement à générer:

  • si l'objet j'utilise est non nul, je retourne un nouveau XElement dans un tableau
  • si elle est nulle, je retourne un Enumerable.Empty

Exemple:

var xml = new XElement("Root", 
    myobject == null ? Enumerable.Empty<XElement>() : <= empty IEnumerable if it is null 
         new []       <= a array with a XElement 
          { 
           new XElement("myobject", 
            new XAttribute("Name", myobject.Name), 
            new XAttribute("Type", myobject.Type) 
           ...) 
          }, 
    ...); 

dans ce cas, le XElement ne sera pas générée si l'objet impliqué dans sa création est nulle.