Как удалить TableRow в WordProcessingML, используя OO XML? - PullRequest
0 голосов
/ 21 марта 2020

У меня очень простой документ с таблицей с несколькими пустыми строками, и я пытаюсь удалить все строки. (Цель состоит в том, чтобы на самом деле удалить только пустые строки, но мне вообще не повезло с удалением каких-либо строк).

public static void SearchAndReplace(string document)
        {
            using (WordprocessingDocument doc = WordprocessingDocument.Open(document, true))
            {
               var body = doc.MainDocumentPart.Document.Body;
                foreach (var table in body.Elements<Table>())
                {
                    foreach (var row in table.Elements<TableRow>())
                    {
                        table.RemoveChild<TableRow>(row);
                        continue;

                    }
                }             
                doc.Save();
            }
        }

В документе одна страница, всего одна таблица с четырьмя ряды, но приведенные выше не удаляют строки по какой-то причине.

Я также пробовал

row.Remove()

Это также не имеет никакого эффекта, т. е. после запуска ни одна строка не удаляется. Есть идеи, что с этим не так? Вот как выглядит мой документ

enter image description here

Спасибо

1 Ответ

1 голос
/ 22 марта 2020

В первой попытке вы использовали IEnumerable<TableRow>, созданный методом OpenXmlElement.Elements<T>(), который перечисляет TableRow экземпляров из коллекции ChildElements вашего Table. Эта коллекция ChildElements вычисляется динамически, а экземпляры возвращаются с использованием yield return. Это происходит, когда вы изменяете эту коллекцию ChildElements, удаляя элементы

  1. , что означает, что вы нарушаете связь между детьми, их родителями и братьями и сестрами,
  2. , что означает, что вы не я не могу получить полный набор элементов TableRow,
  3. , что означает, что вы не можете удалить экземпляры TableRow.

Однако, я думаю, вы сможете удалите первый TableRow экземпляр.

Используя ToList(), вы материализуете коллекцию TableRow экземпляров и получите их все в отдельном List<TableRow>. Таким образом, вы работаете с фиксированной коллекцией, а не с динамически вычисляемой, как вы go. И вот почему это работает.

Как правило, вы никогда не должны изменять коллекцию (например, удаляя элементы коллекции), которую вы перечисляете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...