2017-08-11 77 views
-1

這是我的XML結構的罰球。這是我的代碼來做到這一點:的LINQ to XML讀取方法使用的NullReferenceException C#在VS2017

閱讀從XML:

XDocument rootDocument = XDocument.Load(filePath) 
var vul = from r in rootDocument.Descendants("result") 
select new 
{ 
    Name = r.Element("name").Value 
}; 

創建新的對象:

foreach(var r in vul) 
{ 
    Object a = new Object() 
    { 
     Name = r.Name 
    }; 
} 

的問題是,這個調用

時產生一個NullReferenceException
rootDocument.Descendants("result") 

提前謝謝!

+3

我想你的代碼與XML,它工作正常,我。 –

+0

你檢查過filepath嗎,rootDocuments可能返回null嗎? – hasan

+0

檢查過,rootDocument返回它應該的內容。 @hsnbl – Thomas

回答

0

我找到了這個錯誤的原因。我不知道爲什麼,但調用元素的值會導致它。我改變

Name = r.Element("name").Value 

Name= r.Element("name") 
+1

在導致以前失敗的情況下,它仍然爲空。您只是通過不嘗試訪問空引用上的屬性來避免該異常。 –

+0

沒錯。適當的異常處理也可以完成這項工作。 – Thomas

1

我猜你的選擇試圖訪問一個不存在的元素。

例如有從原始的XML缺少name元件:

例如此XML將會失敗

<root> 
    <report> 
     <results> 
      <result> 
       <name> name 1 </name> 
      </result> 
      <result> 
       <name> name 2 </name> 
      </result> 
      <result> 
       <surname> name 2 </surname> //will fail when loop gets here 
      </result> 
     </results> 
    </report> 
</root> 

如果有可能name元素不會永遠存在,你可以更新的代碼來處理空

var vul = from r in rootDocument.Descendants("result") 
    select new 
    { 
     Name = r.Element("name")?.Value, //this will return null 
    }; 

..as r.Name可以爲空,你需要考慮到這一點在for循環中。

foreach (var r in vul) 
{ 
    string Name = r.Name ?? string.empty; 
} 
+0

我檢查了它。代碼停止工作,第一個這是肯定的。 – Thomas

+0

您可能需要添加原始xml文件和代碼,因爲您添加的代碼和xml沒有問題。 – Scrobi

+0

我無法上傳任何原創內容。但知道我的代碼工作有很大幫助。我需要通過xml工作並搜索任何錯誤。謝謝! – Thomas