2010-07-22 5 views
3

J'ai deux documents Word (WordprocessingDocument), et je veux remplacer le contenu d'un élément dans le premier avec le contenu dans le corps du second.OpenXml: Copier OpenXmlElement entre les documents

C'est ce que je fais en ce moment:

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

Fondamentalement, je récupère le conteneur (un SdtBlock) à partir du premier document en utilisant son alias pour l'identifier, puis obtenir tous les enfants du second élément (en supprimant les SectionProperties que je ne veux pas copier) et en essayant d'ajouter ceux-ci à l'élément container.

Le problème est que je reçois cette exception:

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

Quand j'invoque la dernière ligne sur ce code (Append).

Des idées sur comment puis-je réaliser ce que je veux?

Répondre

3

Le composant elementsToCopy est toujours attaché à son arborescence d'origine. Donc, vous devrez supprimer ses parents ou les copier (pour conserver l'original intact). Je pense qu'il existe une méthode removeParent().

+0

Le nom de la méthode qui supprime un élément de son parent est remove() et CloneNode (true) est le même que Clone() –

7

Vous devez cloner l'élément à copier containerElement.Append(elementsToCopy.CloneNode(true));

Questions connexes