2013-09-23 2 views
0

Я открываю и редактирую Word DOCX в библиотеке OpenXML C#.OpenXML C# Исключение в методе подсчета коллекции

У меня есть этот код:

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; 
} 

, приведенный выше цикл (Еогеасп) ошибки вне с той же проблемой. Кажется, это ошибка OpenXML?

--- EDIT РЕШЕНИЕ ---

Проверить первое, что тип не пуст!

b.Type != null && b.Type == BreakValues.Page 
+0

Я также поставил чек, чтобы проверить, является ли s нулевым, и это не помогает. – jn1kk

ответ

2

Это выглядит один из пункта в p.Descendants() является нулевым

Попробуйте это, где вы явно игнорировать элементы, которые являются нуль в списке (с! = 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 
} 

EDIT:

Внимательно изучая проблему, проблема заключается не в том, что элемент, являющийся нулевым в коллекции, имеет какое-то отношение к преобразованию узла xml «Break» в объект Break. Невозможно преобразовать одно из значений атрибута в тип перечисления. Я сомневаюсь, что в одном из узлов Break есть атрибут под названием «Страница», а значение его пуст или сам атрибут страницы не существует! Просто пройдите через xml и, вероятно, вы сможете это понять!

Возможно, вы можете попробовать изменить тип данных свойства класса «Тип» в строку вместо значения переменной BreakValues.Page для перечисления - просто чтобы убедиться, что теория верна.

+0

Не помогает. Это озадачивает. – jn1kk

+0

Изменен порядок состояния - сначала проверьте s! = Null! – Abey

+0

Не помогает. Кажется, это проблема с библиотекой или, возможно, C#? – jn1kk

Смежные вопросы