2010-10-12 49 views
2

我從XML文件填充匿名對象。截至目前爲止,如何在將XElement添加到匿名對象之前檢查這個XElement是否爲空?

commentary.Elements("Commentator")

一直有一個值,所以我從來沒有檢查null。我不得不刪除它,現在它試圖讀取該行時失敗。

我正在查看代碼,但我不知道要更改什麼,因爲它被選中到匿名對象的屬性中。

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

的事情是,我不能完全清除的線,因爲有時commentary.Elements("Commentator")確實有一個值。我確信之前已經處理過這個問題,但我看不到要做什麼。有任何想法嗎?

+1

當你說失敗,你會得到一個ObjRef錯誤? – Nix 2010-10-12 21:08:57

+0

@Nix,這是一個NullReferenceException – DaveDev 2010-10-12 21:16:11

+0

不是重新回顧過去,但我再次考慮這一點,你確定你的代碼沒有其他錯誤嗎?我只是拿了你的東西,然後通過一個測試,其中評論是無效的,它運行良好? – Nix 2010-10-13 13:55:35

回答

2

只需添加一個空檢查。 (下面的代碼應該是一個優秀的測試人員具有一個與和一個沒有評論員。)

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

未經測試...

怎麼是這樣的:

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

這是一個情況下我可能會考慮運營商?? (coalesce)

null ?? x --> x 

在這種情況下,您可以逃脫合併爲一個空的Enumerable。

+0

感謝您指出使用空的Enumerable。 – Larry 2013-04-19 05:47:34

0

我使用?運營商通過這種方式來阻止的XMLElement中產生:

  • 如果我使用的對象不是空的,我在一個陣列
  • 返回一個新的XElement如果是空的,我返回Enumerable.Empty

實施例:

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) 
           ...) 
          }, 
    ...); 

在這種情況下,的XElement不會如果參與其創作的對象爲空生成。

相關問題