我的Mule流程中有一个字符串输入。它通过我的Groovy脚本并输出XML。我原来有一个脚本后跟一个XSLT转换器来删除空节点并将缩进设置为" no"在输出标记中。但是现在我删除了它,因为如果我想保留特殊字符,我就不能将它与我的脚本一起使用(参见上一个问题.push
)。
相反,我现在在打印节点之前检查每个值。但是我遇到的问题是我的XML需要缩减以便与我的InDesign项目一起使用我适应XML。当我删除XSLT时,我失去了这种能力,因此我解决了一个问题,但创建了另一个问题。
我找到了方法getPrinter(),我将它与setAutoIndent(false)一起使用,但它没有改变任何输出并且没有创建错误。不确定在哪里使用它。
这是我的剧本:
public Boolean isEmpty(value){
if(value.toString().trim() == "" || value.toString().trim() == '' || value == null)
return true;
}
root = new XmlSlurper(false,false).parseText(payload)
if(root.name() == 'GetActivitiesResponse')
startEach = root.children().children()
else
startEach = root.children()
def xml = new StringWriter().with { w -> new groovy.xml.MarkupBuilder(w).with {
mkp.xmlDeclaration(version: "1.0", encoding: "utf-8")
escapeAttributes = false
getPrinter().setAutoIndent(false);
"w_import_saisie_web"() {
startEach.each { p -> "w_evenement"() {
if(!isEmpty(p.PresentationDate))
"w_dates"{ mkp.yieldUnescaped (p.PresentationDate.toString() + "
") }
if(!isEmpty(p.SubTitle))
"w_contexte"{ mkp.yieldUnescaped (p.SubTitle.toString() + "
") }
//if(!isEmpty(p.SubTitle))
"w_nom_evenement"{ /*p.GEVT_Type*/ mkp.yieldUnescaped ("Nom evenement" + "
") }
if(!isEmpty(p.Name))
"w_titre"{ mkp.yieldUnescaped (p.Name.toString() + "
")}
if(!isEmpty(p.ShortDescription) || !isEmpty(p.Teaser))
"w_texte"{mkp.yieldUnescaped (p.ShortDescription.toString() + p.Teaser.toString() + "
")}
p.SubEvents.children().each { q -> "w_bloc_sous_evenement"() {
if(!isEmpty(q.PresentationDate) || !isEmpty(q.Name))
"w_sous_eve_titre"{ mkp.yieldUnescaped (q.PresentationDate.toString() + q.Name.toString() + "
")}
if(!isEmpty(q.ShortDescription) || !isEmpty(q.Teaser) || !isEmpty(q.WebDescription))
"w_sous_eve_desc"{mkp.yieldUnescaped (q.ShortDescription.toString() + q.Teaser.toString() + q.WebDescription.toString() + "
")}
}
}
if(!isEmpty(p.Site) || !isEmpty(p.PresentationHours))
"w_coordonnees"{ mkp.yieldUnescaped ("teeeessdfsdfsdfst" + p.Site.toString() + ' - ' + p.PresentationHours.toString() + "
")}
}
}
}
}
w.toString()
}
答案 0 :(得分:1)
创建MarkupBuilder时添加IndentPrinter。
def xml = new MarkupBuilder(new IndentPrinter(new PrintWriter(writer), "", true))
看到这个问题: groovy.xml.MarkupBuilder disable PrettyPrint
我尝试了很多不同的东西来看看setAutoIndent是否有效(例如在将IndentPrinter传递给MarkupBuilder之前设置它)并且它似乎没有任何效果。所以,和你一样,我想知道它的目的。
答案 1 :(得分:0)
意识到我的搜索太难了......只是在最后将这条简单的行添加到了toString()......
w.toString().replaceAll(">\\s+<", "><").trim();