We're sorry Aspose doesn't work properply without JavaScript enabled.

Free Support Forum - aspose.com

Insert StructuredDocumentTag / replace text with StructuredDocumentTag

Hello



I have a problem with insert of StructuredDocumentTag, or find and replace some text with StructuredDocumentTag.



Whatever I do, I get different exceptions. What I want is:



1.) find any text and replace this text with StructuredDocumentTag

2.) Navigate through document and insert StructuredDocumentTag an specific Position. What are valid nodetype for (parent) insert operation?



What do I make wrong …?





Thanks

Stephan

Hello



I have a problem with insert of StructuredDocumentTag, or find and replace some text with StructuredDocumentTag.



Whatever I do, I get different exceptions. What I want is:



1.) find any text and replace this text with StructuredDocumentTag

2.) Navigate through document and insert StructuredDocumentTag an specific Position. What are valid nodetype for (parent) insert operation?



What do I make wrong …?





Thanks

Hi Stephan,


Thanks for your inquiry. Please use the following code to achieve this:

Document doc = new Document(MyDir + @“document.docx”);

// 1. find and replace some text with some StructuredDocumentTag

doc.Range.Replace(new System.Text.RegularExpressions.Regex("{VAR}"), new StructuredTagReplaceEvaluator(), false);

doc.Save(MyDir + @“out.docx”);


private class StructuredTagReplaceEvaluator : Aspose.Words.IReplacingCallback<o:p></o:p>

{

Aspose.Words.ReplaceAction Aspose.Words.IReplacingCallback.Replacing(Aspose.Words.ReplacingArgs e)

{

// This is a Run node that contains either the beginning or the complete match.

Node currentNode = e.MatchNode;

// The first (and may be the only) run can contain text before the match,

// in this case it is necessary to split the run.

if (e.MatchOffset > 0)

currentNode = SplitRun((Run)currentNode, e.MatchOffset);

// This array is used to store all nodes of the match for further removing.

ArrayList runs = new ArrayList();

// Find all runs that contain parts of the match string.

int remainingLength = e.Match.Value.Length;

while (

(remainingLength > 0) &&

(currentNode != null) &&

(currentNode.GetText().Length <= remainingLength))

{

runs.Add(currentNode);

remainingLength = remainingLength - currentNode.GetText().Length;

// Select the next Run node.

// Have to loop because there could be other nodes such as BookmarkStart etc.

do

{

currentNode = currentNode.NextSibling;

}

while ((currentNode != null) && (currentNode.NodeType != NodeType.Run));

}

// Split the last run that contains the match if there is any text left.

if ((currentNode != null) && (remainingLength > 0))

{

SplitRun((Run)currentNode, remainingLength);

runs.Add(currentNode);

}

StructuredDocumentTag plainText = new StructuredDocumentTag((Document)e.MatchNode.Document, SdtType.PlainText, MarkupLevel.Inline);

DocumentBuilder builder = new DocumentBuilder((Document)e.MatchNode.Document);

builder.MoveTo((Run)runs[runs.Count - 1]);

builder.InsertNode(plainText);

//Now remove all runs in the sequence.

foreach (Run run in runs)

run.Remove();

return ReplaceAction.Skip;

}

}

///

/// Splits text of the specified run into two runs.

/// Inserts the new run just after the specified run.

///

private static Run SplitRun(Run run, int position)

{

Run afterRun = (Run)run.Clone(true);

afterRun.Text = run.Text.Substring(position);

run.Text = run.Text.Substring(0, position);

run.ParentNode.InsertAfter(afterRun, run);

return afterRun;

}


I hope, this helps.

Best regards,