集合计数方法中的 OpenXML C# 异常
本文关键字:OpenXML 异常 方法 集合 | 更新日期: 2023-09-27 18:32:22
我正在C# OpenXML库中打开并编辑Word DOCX。
我有这个代码:
IEnumerable<Break> breaks = p.Descendants<Break>().Where(s => s != null && s.Type == BreakValues.Page);
int count = breaks.Count(); // THIS THROWS EXCEPTION!
例外情况是:
Error in implicit conversion. Cannot convert null object.
at DocumentFormat.OpenXml.EnumValue`1.op_Implicit(EnumValue`1 xmlAttribute)
at Reporting.Report.<generate>b__1(Break s)
at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
at System.Linq.Enumerable.Count[TSource](IEnumerable`1 source)
at Reporting.Report.generate()
然而,这
Console.WriteLine("breaks == null? : " + (breaks == null));
返回错误:
breaks == null? : False
这是库中的错误吗?
---编辑---
private int manualCount(IEnumerable<OpenXmlElement> col)
{
int count = 0;
if (col == null)
{
return count;
}
foreach (OpenXmlElement elem in col)
{
count++;
}
return count;
}
上述循环(foreach)出现相同问题的错误。那么似乎是一个OpenXML错误?
---编辑解决方案---
首先检查类型是否为空!
b.Type != null && b.Type == BreakValues.Page
看起来 p.Descendants() 中的一个项目为空
尝试一下,明确忽略列表中为 null 的项目 (s != null)
IEnumerable<Break> breaks = p.Descendants<Break>().Where(s => s != null && s.Type == BreakValues.Page);
如果这不起作用,请显式循环它并查看即将发生的事情
var breaks = p.Descendants<Break>();
foreach(var item in breaks)
{
//debug every item and see what is coming out of item.Type
}
编辑:
更仔细地看,问题不在于集合中的项为 null,它与将"Break"xml节点转换为Break对象有关。无法将其中一个属性值转换为枚举类型。即我怀疑其中一个 Break 节点具有一个名为"Page"的属性,并且它的值为空或页面属性本身不存在!只需浏览一下 xml,也许您就可以弄清楚!
您可能可以尝试的是将 Break 类的"Type"属性的数据类型更改为字符串而不是枚举值 BreakValues.Page 只是为了查看理论是否正确。