具有空值的 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;       
 }

您必须检查您当前 XElementValue-属性 是否为 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 字符串

的地方