2013-10-04 89 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文件可以使用其他方法生成,當然還有更多循環。 –

相關問題