2017-08-11 79 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