2010-11-12 7 views
3

J'essaie de remplacer un espace réservé d'élément de texte par une image dans un docx openXML.Insérer une chaîne XML dans un document openXML

J'ai trouvé un tutoriel here qui semble faire ce dont j'ai besoin, mais je ne suis pas tout à fait ce qu'il fait pour insérer l'image.

Fondamentalement, j'ai un 'modèle d'image' XML stocké dans une chaîne. Je peux stocker mon image dans le dossier média et insérez l'ID d'image dans la chaîne XML:

string imageNode 
     = _xml.Replace("##imageId##", documentMainPart.GetIdOfPart(newImage)); 

maintenant j'ai le code XML correct comme une chaîne que je dois insérer dans le document.

je peux trouver mon nœud de texte d'espace réservé que je veux remplacer par la nouvelle image XML

var placeholder = documentMainPart.Document.Body 
       .Descendants<DocumentFormat.OpenXml.Wordprocessing.Text>() 
       .Where(t => t.Text.Contains("##imagePlaceholder##")).First(); 

Mais c'est là que je suis bloqué. Je ne peux pas voir comment faire un remplacement/insertion qui prendra une chaîne XML. J'ai réussi à obtenir ma sortie XML en tant que texte dans le document, mais je me suis efforcé de le convertir en un élément XML.

Répondre

1

Si vous demandez comment vous importez le code XML qui affiche l'image, cela ne devrait pas poser de gros problème.

Comment vous stockez l'image Je ne suis pas sûr cependant, mais je suppose que vous devrez l'importer avec un nom approprié quelque part dans le fichier .docx mais je suppose que vous le savez en lisant votre message.

Remplacement de l'espace réservé à l'image xml thingy est facile

var parent = placeholder.Parent; 
parent.ReplaceChild(imageXML, placeholder); 

Ici vous remplacez réellement l'image thingy avec l'étiquette de texte, mais je ne peux pas être sûr de savoir comment cela pourrait fonctionner. Je sais qu'une image peut être dans une balise d'exécution que je suppose est le parent de votre balise de texte. Maintenant, si votre XML que vous obtenez forme votre commande est correcte, vous devriez être OK. Il devrait être dessin/en ligne/graphique racine je pense.

S'il vous plaît commenter Si je suis mal compris votre question

1

Pour convertir votre représentation de chaîne à un noeud XML appartenant au document xml, utilisez XmlDocument.CreateFragment:

XmlDocumentFragment docFrag = doc.CreateDocumentFragment(); 
docFrag.InnerXml = imageXML; 
placeholder.Parent.ReplaceChild(docFrag,placeholder); 
Questions connexes