我正在使用XmlTemplateEngine创建多个XML文件。目前我遇到了XML生成失败的情况。如果将单引号用作xml标记的值,则会失败
以下是方法:
public static void mergeXmlTemplateToFile(File src, File dest, Map bindings){
File part = new File(FileUtils.getTempDirectoryPath()+"/"+src.name)
new XmlTemplateEngine().createTemplate(src).make(bindings).writeTo(new PrintWriter(part))
XMLMerger merger = new XMLMerger(part, dest)
merger.merge();
part.delete()
}
呼叫:
BuildUtils.mergeXmlTemplateToFile(new File(template+"area/cms/sharepoint.xml"), new File(output+"area/conf/config_complete.xml"), [servers:Builder.config.area.cms.sharepoint.servers, hostnames:Builder.config.server.hostnames])
问题是,临时文件和date.format的值有单引号。 date.format的值需要单引号。 XmlTemplateEngine不能使用双引号。我不能将临时文件用于后续步骤,因为它无效。 [致命错误] sharepoint.xml:元素类型“property”必须后跟属性规范“>”或“/>”。 因为这是无效的:
<property name='date.format' value='yyyy-MMdd'T'HH:mm:ss'Z''/>
临时档案:
<config>
<cms>
<type name='SharePoint'>
<host ident=''>
<property name='user' value='demo'/>
<property name='password' value='pass'/>
<property name='domain' value='example.com'/>
<property name='date.format' value='yyyy-MMdd'T'HH:mm:ss'Z''/>
</host>
</type>
</cms>
</config>
模板:
<config xmlns:gsp="http://groovy.codehaus.org/2005/gsp">
<cms>
<ctype name="SharePoint">
<gsp:scriptlet>servers.server.each { server -></gsp:scriptlet>
<host ident="${server.ident.text()}">
<property name="user" value="${server.user.text()}" />
<property name="password" value="${server.password.text()}" />
<property name="domain" value="${server.domain.text()}" />
<property name="date.format" value="${server.dateformat.text()}" />
</host>
<gsp:scriptlet>}</gsp:scriptlet>
</type>
</cms>
我曾尝试使用MarkupTemplateEngine而不是XmlTemplateEngine,但我没有成功。 http://www.groovy-lang.org/templating.html#_the_markuptemplateengine
TemplateConfiguration config = new TemplateConfiguration();
config.useDoubleQuotes = true;
MarkupTemplateEngine engine = new MarkupTemplateEngine(config);
engine.createTemplate(src).make(bindings).writeTo(new PrintWriter(part))
import groovy.util.logging.Log4j;
import javax.xml.parsers.DocumentBuilder
import javax.xml.parsers.DocumentBuilderFactory
import org.atteo.xmlcombiner.XmlCombiner
import com.google.common.collect.Lists;
@Log4j
class XMLMerger {
File src
File dest
public XMLMerger(File src, File dest){
this.src = src
this.dest = dest
}
public void merge(){
merge(null)
}
public void merge(String id){
if(src.exists() && dest.exists()){
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
XmlCombiner combiner = new XmlCombiner();
if(id != null)
combiner = new XmlCombiner(id);
combiner.combine(docBuilder.parse(dest))
combiner.combine(docBuilder.parse(src))
combiner.buildDocument(dest.toPath())
}
}
}
问题发生在调用XMLMerger之前。 以下是有关可以在线运行的XmlTemplateEngine的示例:http://goo.gl/A0pxfs
由于
答案 0 :(得分:2)
XmlUtil
中有一种名为escapeXml
的实用方法,您可以这样做:
import groovy.text.XmlTemplateEngine
import static groovy.xml.XmlUtil.escapeXml
// Escape values going in to the binding
def binding = [dateformat: escapeXml("yyyy-MMdd'T'HH:mm:ss'Z'")]
def engine = new XmlTemplateEngine()
def text = '''<config xmlns:gsp="http://groovy.codehaus.org/2005/gsp">
| <cms>
| <type name="SharePoint">
| <host ident="">
| <property name="user" value="" />
| <property name="password" value="" />
| <property name="domain" value="" />
| <property name="date.format" value="${dateformat}" />
| </host>
| </type>
| </cms>
|</config>'''.stripMargin()
def template = engine.createTemplate(text).make(binding)
println template.toString()