具有空值的 Xelement Linq?
Xelement Linq with Null value?
我尝试获取所有Xelement值并插入到数组中,但是当Xelement为空时,插入数组时会显示如下错误:
Object reference not set to an instance of an object.
是否可以删除空值?或者用非空值替换空值?请多多指教。
数据库中 XML 格式的我的节点(第三个值为空):
<AnswerData><Answer1>a1</Answer1><Answer2>a2</Answer2><Answer3></Answer3></AnswerData>
我的控制器:
int z = 0;
string[] multiresultanswer = new string[choicesubqarray.Count()];
for (int x = 0; x < multiresultanswer.Count(); x++)
{
XElement RateAns =
(from node in qconfig.Elements("Answer" + (x + 1))
select node).SingleOrDefault();
// Error when store 3rd value ====> multiresultanswer[z++] = RateAns.Value;
}
您必须检查您当前 XElement
的 Value
-属性 是否为 NULL
。
var rateAns = qconfig.Elements("Answer" + (x + 1)).Where(el => el.Value != null));
因此您不需要对 NULL
值进行任何进一步处理,因此您的 RateAns == null
已过时,因为您的查询没有 return 任何 NULL 元素。
你好像误解了SingleOrDefault
的意思。
SingleOrDefault
returns null
如果没有找到元素。因此,在 (RateAns == null)
的情况下, 在您的 XML 中没有给定数字 的答案。因此,没有什么可删除的。
我认为你这样工作会更容易:
string[] multiresultanswe = Enumerable
.Range(1, choicesubqarray.Count())
.Select(x => (from node in qconfig.Elements("Answer" + x)
select node).SingleOrDefault())
.Where(x => x != null)
.Select(x => x.Value)
.ToArray();
这将需要获取答案范围 (Enumerable.Range
),将数字列表更改为所需结果 (Select
),忽略空值 (Where
),转换它与值(Select
),并将结果放入数组(ToArray
)。
您还可以改进 (from node in qconfig.Elements("Answer" + x) select node).SingleOrDefault()
,将其更改为 qconfig.Elements("Answer" + x).SingleOrDefault()
,效果相同。
string xml = @"<AnswerData><Answer1>a1</Answer1><Answer2>a2</Answer2><Answer3>null</Answer3></AnswerData>";
XElement root = XElement.Parse(xml);
int count = 5;
var query = from n in Enumerable.Range(1, count)
join e in root.Elements() on n.ToString() equals e.Name.LocalName.Substring(6) into g
from e in g.DefaultIfEmpty()
select e == null ? null : e.Value == "null" ? null : e.Value;
foreach (var q in query)
{
Console.WriteLine(q == null ? "NULL VALUE" : q);
}
您想跳过元素值为 null
字符串
的地方
我尝试获取所有Xelement值并插入到数组中,但是当Xelement为空时,插入数组时会显示如下错误:
Object reference not set to an instance of an object.
是否可以删除空值?或者用非空值替换空值?请多多指教。
数据库中 XML 格式的我的节点(第三个值为空):
<AnswerData><Answer1>a1</Answer1><Answer2>a2</Answer2><Answer3></Answer3></AnswerData>
我的控制器:
int z = 0;
string[] multiresultanswer = new string[choicesubqarray.Count()];
for (int x = 0; x < multiresultanswer.Count(); x++)
{
XElement RateAns =
(from node in qconfig.Elements("Answer" + (x + 1))
select node).SingleOrDefault();
// Error when store 3rd value ====> multiresultanswer[z++] = RateAns.Value;
}
您必须检查您当前 XElement
的 Value
-属性 是否为 NULL
。
var rateAns = qconfig.Elements("Answer" + (x + 1)).Where(el => el.Value != null));
因此您不需要对 NULL
值进行任何进一步处理,因此您的 RateAns == null
已过时,因为您的查询没有 return 任何 NULL 元素。
你好像误解了SingleOrDefault
的意思。
SingleOrDefault
returns null
如果没有找到元素。因此,在 (RateAns == null)
的情况下, 在您的 XML 中没有给定数字 的答案。因此,没有什么可删除的。
我认为你这样工作会更容易:
string[] multiresultanswe = Enumerable
.Range(1, choicesubqarray.Count())
.Select(x => (from node in qconfig.Elements("Answer" + x)
select node).SingleOrDefault())
.Where(x => x != null)
.Select(x => x.Value)
.ToArray();
这将需要获取答案范围 (Enumerable.Range
),将数字列表更改为所需结果 (Select
),忽略空值 (Where
),转换它与值(Select
),并将结果放入数组(ToArray
)。
您还可以改进 (from node in qconfig.Elements("Answer" + x) select node).SingleOrDefault()
,将其更改为 qconfig.Elements("Answer" + x).SingleOrDefault()
,效果相同。
string xml = @"<AnswerData><Answer1>a1</Answer1><Answer2>a2</Answer2><Answer3>null</Answer3></AnswerData>";
XElement root = XElement.Parse(xml);
int count = 5;
var query = from n in Enumerable.Range(1, count)
join e in root.Elements() on n.ToString() equals e.Name.LocalName.Substring(6) into g
from e in g.DefaultIfEmpty()
select e == null ? null : e.Value == "null" ? null : e.Value;
foreach (var q in query)
{
Console.WriteLine(q == null ? "NULL VALUE" : q);
}
您想跳过元素值为 null
字符串