OpenXml: копировать OpenXmlElement между документами - PullRequest
3 голосов
/ 22 июля 2010

У меня есть два документа Word (WordprocessingDocument), и я хочу заменить содержимое элемента в первом содержимым в теле второго.

Это то, что я делаю правильносейчас:

var docA = WordprocessingDocument.Open(docAPath, true);
var docB = WordprocessingDocument.Open(docBPath, true);

var containerElement = docA.MainDocumentPart.Document.Body
           .Descendants<SdtBlock>()
           .FirstOrDefault(sdt => sdt.SdtProperties.Descendants<SdtAlias>().Any(alias => alias.Val == containerElementName))
           .SdtContentBlock;

var elementsToCopy = docB.MainDocument.Part.Document.Body.ChildElements.Where(e => e.LocalName != "sectPr"));

containerElement.RemoveAllChildren();
containerElement.Append(elementsToCopy);

По сути, я получаю контейнер (SdtBlock) из первого документа, используя его псевдоним, чтобы идентифицировать его, затем получаю все дочерние элементы второго элемента (удаляя свойства SectionProperties, которые мне не нужныскопировать), а затем попытаться добавить их в элемент контейнера.

Проблема в том, что я получаю следующее исключение:

Cannot insert the OpenXmlElement "newChild" because it is part of a tree.

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

Есть идеи, как мне добиться того, чего я хочу?

Ответы [ 2 ]

7 голосов
/ 27 февраля 2012

Вам необходимо клонировать элемент для копирования containerElement.Append(elementsToCopy.CloneNode(true));

3 голосов
/ 16 сентября 2010

elementsToCopy по-прежнему прикреплен к исходному дереву.Таким образом, вам придется удалить его родителей или скопировать их (чтобы сохранить оригинал нетронутым).Я думаю, что существует метод removeParent ().

...