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.

Get Connected