Groovy를 사용하여 XML 파일을 동적으로 작성하려고합니다. 모든 것이 작동하는 단순함에 만족하지만 클로저와 대리인 뒤에있는 전체 메커니즘을 이해하는 데 어려움을 겪고 있습니다. 고정 된 이름으로 속성과 자식 노드를 추가하는 것은 쉬운 것처럼 보이지만 동적 이름을 가진 노드를 추가하는 것은 특별한 경우 인 것처럼 보입니다.StreamingMarkupBuilder를 사용하여 Groovy에서 노드를 XML에 동적으로 추가하는 방법
본 사례에서는 CQ5에서 사용할 수있는 _rep_policy 파일을 작성하고 있습니다.
<?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))
}
'_rep_policy_files'에있는 내용과 결과 XML이 어떻게 같아야합니까? – dmahapatro
스크립트 위를 보면 xml 예제가 있습니다. –