Modify file content programatically

From OpenCms Wiki
Jump to: navigation, search

This is a short example on how to modify an XML content (structured content) file programatically. (The code is based on a blog post by Sebastian Himberger.)

<%@page import="java.util.Locale" %>
<%@page import="org.opencms.jsp.CmsJspActionElement" %>
<%@page import="org.opencms.file.*" %>
<%@page import="org.opencms.xml.types.*" %>
<%@page import="org.opencms.xml.*" %>
<%@page import="org.opencms.xml.content.*" %>
CmsJspActionElement cms = new CmsJspActionElement(pageContext, request, response);
CmsObject cmso = cms.getCmsObject();
// Locale should be set to the same locale that you want to manipulate for
Locale locale = cms.getRequestContext().getLocale(); 
// Log in special user and make sure project is set to "Offline"
cmso.loginUser("my_script_user", "password");
if (cms.getRequestContext().currentProject().isOnlineProject()) {
// Read the XML/structured content resource to modify
String resourcePath = "/path/to/the-file-to-modify.html";
CmsResource resource = cmso.readResource(resourcePath); // Also possible to use the createResource method here
CmsFile file = cmso.readFile(resource);
CmsXmlContent xmlContent = CmsXmlContentFactory.unmarshal(cmso, file); 
// Manipulate the content
// Non-optional <element name="Title" type="OpenCmsString" />
xmlContent.getValue("Title", locale).setStringValue(cmso, "My new title");
// Non-optional <element name="Description" type="OpenCmsHtml" />
xmlContent.getValue("Description", locale).setStringValue(cmso, "<p>My <em>new</em> description!</p>");
// Non-optional nested element ("Type"), containing 2 OpenCmsBoolean elements ("Foo" and "Bar")
I_CmsXmlContentValue typeValue = xmlContent.getValue("Type", locale);
xmlContent.getValue(typeValue.getPath() + "/Foo", locale).setStringValue(cmso, "true");
xmlContent.getValue(typeValue.getPath() + "/Bar", locale).setStringValue(cmso, "false");
// Optional <element name="Link" type="OpenCmsVarLink" minOccurs="0" maxOccurs="100" />
// Note the different method call for optional elements; they need to be added to the XML
// (If order is important, use a counter instead of just zero for the 4th "insert at index" argument)
xmlContent.addValue(cmso, "Link", locale, 0).setStringValue(cmso, ""); 
xmlContent.addValue(cmso, "Link", locale, 0).setStringValue(cmso, ""); 
xmlContent.addValue(cmso, "Link", locale, 0).setStringValue(cmso, "");
// Done manipulating
// Replace the original file content with the manipulated file content ("commit changes")
// Unlock the resource
Personal tools