2013-10-04 61 views
0

我正在尝试使用Groovy动态创建XML文件。我很满意简单的一切工作,但我很难理解关闭和代表的整个机制。尽管使用固定名称添加属性和子节点似乎很容易,但添加具有动态名称的节点似乎是一种特殊情况。如何使用StreamingMarkupBuilder将节点动态添加到Groovy中

我的用例是创建一个_rep_policy文件,它可以在CQ5中使用。

<?xml version="1.0" encoding="UTF-8"?> 
<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:rep="internal" 
      jcr:primaryType="rep:ACL"> 
    <allow 
     jcr:primaryType="rep:GrantACE" 
     rep:principalName="administrators" 
     rep:privileges="{Name}[jcr:all]"/> 
    <allow0 
     jcr:primaryType="rep:GrantACE" 
     rep:principalName="contributor" 
     rep:privileges="{Name}[jcr:read]"/> 
</jcr:root> 

处理集合工作正常,但生成的名称...

进口groovy.xml.StreamingMarkupBuilder 进口groovy.xml.XmlUtil

def _rep_policy_files = [ 
    '/content': [ // the path 
     'deny': [ // permission 
      'jcr:read': [ // action 
       'a1', 'b2']], // groups 
     'allow': [ 
      'jcr:read, jcr:write': [ 
       'c2'] 
     ] 
    ] 
] 

def getNodeName(n, i) { 
    (i == 0) ? n : n + (i - 1) 
} 

_rep_policy_files.each { 
    path, permissions -> 
    def builder = new StreamingMarkupBuilder(); 

    builder.encoding = "UTF-8"; 

    def p = builder.bind { 
     mkp.xmlDeclaration() 

     namespaces << [ 
      jcr: 'http://www.jcp.org/jcr/1.0', 
      rep: 'internal' 
     ] 

     'jcr:root'('jcr:primaryType': 'rep:ACL') { 
     permissions.each { 
      permission, actions -> 
      actions.each { 
       action, groups -> 
       groups.eachWithIndex { 
        group, index -> 
        def nodeName = getNodeName(permission, index) 
        "$nodeName"(
         'jcr:primaryType': 'rep:GrantACE', 
         'rep:principalName': "$group", 
         'rep:privileges': "{Name}[$action]") 
       } 
      } 
     } 
     } 
    } 

    print(XmlUtil.serialize(p)) 
} 
+0

结果xml应该看起来像'_rep_policy_files'中的内容吗? – dmahapatro

+0

请参阅上面的脚本...这里是xml示例。 –

回答

1

这是不是(或类似)你在找什么?

'jcr:root'('jcr:primaryType': 'rep:ACL') { 
    _rep_policy_files['/content'].each {k, v -> 
     if(k == 'allow') 
      "$k"('jcr:primaryType': 'rep:GrantACE', 
       'rep:principalName': 'administrators', 
       'rep:privileges': "$v" ){} 
     if(k == 'deny') 
      "$k"('jcr:primaryType': 'rep:GrantACE', 
       'rep:principalName': 'contributor', 
       'rep:privileges': "$v" ){} 
    } 
} 

问题出生成的XML不能与你有什么_rep_policy_files正确逮捕。

+0

谢谢,我找到了解决方案。 XML文件可以使用其他方法生成,当然还有更多循环。 –

相关问题