How to search and replace content programmatically?
Last modified by Vincent Massol on 2017/01/29
You have 2 main options:
- Use search/replace in a script. For example something like the following would replace the word welcome with "bienvenue" everywhere in the wiki:
{{velocity}} #set ($xwql = "where doc.content like '%welcome%'") #foreach ($item in $services.query.xwql($xwql).execute()) #if ($request.confirm == "1") #set ($itemDoc = $xwiki.getDocument($item)) $itemDoc.setContent($itemDoc.getContent().replaceAll( "welcome", "bienvenue")) $itemDoc.save("Replaced bienvenue") * [[$item>>$item]] replaced! #else * [[$item>>$item]] #end #end [[Replace "welcome" by "bienvenue">>?confirm=1]] {{/velocity}}
- Use the XWiki Syntax AST to perform more surgical replaces. For example to modify all links so that they are displayed in italics you could use something like:
{{groovy}} import org.xwiki.rendering.block.* import org.xwiki.rendering.block.match.* import org.xwiki.rendering.listener.* def mydoc = xwiki.getDocument('Sandbox.VMA') def xdom = mydoc.getXDOM() for (Block block : xdom.getBlocks(new ClassBlockMatcher(LinkBlock.class), Block.Axes.DESCENDANT)) { Block parentBlock = block.getParent(); Block newBlock = new FormatBlock(Collections.<Block>singletonList(block), Format.ITALIC); parentBlock.replaceChild(newBlock, block); } // Save the modified XDOM mydoc.setContent(xdom) mydoc.save('made links in italics') {{/groovy}}
See the Rendering module for more details.