Linq to XML 读取方法在 VS2017 中使用 C# 抛出 NullReferenceException
Linq to XML read method throws NullReferenceException using C# in VS2017
这是我的 XML 结构:
<root>
<report>
<results>
<result>
<name> name 1 </name>
</result>
<result>
<name> name 2 </name>
</result>
</results>
</report>
</root>
我想读取 result 中的信息并创建一个对象以将其属性设置为该值。这是我执行此操作的代码:
阅读自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")
提前致谢!
我猜测您的 select 正在尝试访问不存在的元素。
例如,原始 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 元素可能不会始终存在,您可以更新代码以处理 null
var vul = from r in rootDocument.Descendants("result")
select new
{
Name = r.Element("name")?.Value, //this will return null
};
..因为 r.Name
可以为空,您需要在 for 循环中考虑到这一点。
foreach (var r in vul)
{
string Name = r.Name ?? string.empty;
}
我找到了这个错误的原因。我不知道为什么,但是调用元素的值会导致它。我变了
Name = r.Element("name").Value
到
Name= r.Element("name")
这是我的 XML 结构:
<root>
<report>
<results>
<result>
<name> name 1 </name>
</result>
<result>
<name> name 2 </name>
</result>
</results>
</report>
</root>
我想读取 result 中的信息并创建一个对象以将其属性设置为该值。这是我执行此操作的代码:
阅读自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
};
}
问题是这会在调用
时产生 NullReferenceExceptionrootDocument.Descendants("result")
提前致谢!
我猜测您的 select 正在尝试访问不存在的元素。
例如,原始 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 元素可能不会始终存在,您可以更新代码以处理 null
var vul = from r in rootDocument.Descendants("result")
select new
{
Name = r.Element("name")?.Value, //this will return null
};
..因为 r.Name
可以为空,您需要在 for 循环中考虑到这一点。
foreach (var r in vul)
{
string Name = r.Name ?? string.empty;
}
我找到了这个错误的原因。我不知道为什么,但是调用元素的值会导致它。我变了
Name = r.Element("name").Value
到
Name= r.Element("name")