集合计数方法中的 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

集合计数方法中的 OpenXML C# 异常

看起来 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 只是为了查看理论是否正确。