xml - Groovy - 使用单引号创建有效的 XML 文件是不可能的

标签 xml groovy

我正在使用 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 不能使用双引号。我无法将临时文件用于后续步骤,因为它无效。 [ fatal error ] 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

谢谢

最佳答案

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()

关于xml - Groovy - 使用单引号创建有效的 XML 文件是不可能的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33923902/

相关文章:

c# - 简单的 C# Xml 序列化

php - 使用 PHP DOM 的具有混合内容的 XML 节点

Grails/Groovy 不会在对象的集合中持续更改

java - Selenium headless Chrome 崩溃,而有头 Chrome 工作得很好

java - 如何设置 apache Camel Groovy 脚本组件的属性

html - 如何用 HTML 和 JavaScript/JQuery 替换数据库以创建动态相关的下拉选择列表?

java - 如何为给定 xml 的客户端 saaj 创建 SOAP 请求

java - 使用 JAXB 处理丢失的节点

gradle - 为什么Gradle不了解该文件是Groovy?

gradle - 无法在gradle中合并属性值