1

我正在 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 错误?

--- 编辑解决方案 ---

首先检查 Type 不为空!

b.Type != null && b.Type == BreakValues.Page
4

1 回答 1

2

它看起来 p.Descendants() 中的一项为空

试试这个,你明确地忽略列表中为空的项目(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
}

编辑:

仔细观察,问题不在于集合中的项目为空,它与将“Break”xml 节点转换为 Break 对象有关。无法将属性值之一转换为枚举类型。即我怀疑Break 节点之一有一个名为“Page”的属性,它的值为空或Page 属性本身不存在!只需通过xml,您可能就可以弄清楚!

可能您可以尝试将 Break 类的“Type”属性的数据类型更改为字符串而不是 BreakValues.Page 枚举值 - 只是为了看看理论是否正确。

于 2013-09-23T14:41:21.170 回答