Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用StreamingMarkupBuilder在Groovy中向XML动态添加节点_Groovy_Streamingmarkupbuilder - Fatal编程技术网

如何使用StreamingMarkupBuilder在Groovy中向XML动态添加节点

如何使用StreamingMarkupBuilder在Groovy中向XML动态添加节点,groovy,streamingmarkupbuilder,Groovy,Streamingmarkupbuilder,我正在尝试使用Groovy动态创建一个XML文件。我很高兴一切都很简单,但我很难理解闭包和委托背后的整个机制。虽然使用固定名称添加属性和子节点似乎很容易,但使用动态名称添加节点似乎是一种特例 我的用例是创建一个_rep_策略文件,可以在CQ5中使用 <?xml version="1.0" encoding="UTF-8"?> <jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:rep="internal"

我正在尝试使用Groovy动态创建一个XML文件。我很高兴一切都很简单,但我很难理解闭包和委托背后的整个机制。虽然使用固定名称添加属性和子节点似乎很容易,但使用动态名称添加节点似乎是一种特例

我的用例是创建一个_rep_策略文件,可以在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))
}
def_rep_policy_文件=[
“/content”:[//路径
“拒绝”:[//权限
'jcr:read':[//操作
“a1”,“b2']],//组
“允许”:[
'jcr:read,jcr:write':[
“c2”]
]
]
]
def getNodeName(n,i){
(i==0)?n:n+(i-1)
}
_rep_policy_files.each{
路径,权限->
def builder=新StreamingMarkupBuilder();
builder.encoding=“UTF-8”;
def p=builder.bind{
mkp.xml声明()
名称空间
行动{
行动,小组->
groups.eachWithIndex{
组,索引->
def nodeName=getNodeName(权限、索引)
“$nodeName”(
'jcr:primaryType':'rep:GrantACE',
'代表:principalName':“$group”,
'代表:特权':“{Name}[$action]”)
}
}
}
}
}
打印(XmlUtil.serialize(p))
}
这是您正在寻找的东西(或类似的东西)吗

'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"  ){}
    }
}

使用
\u rep\u policy\u文件

中的内容无法正确理解所显示的结果xml,结果xml与
\u rep\u policy\u文件
中的内容应该是什么样的?请参见上面的脚本。。。这是xml示例。谢谢,我找到了解决方案。XML文件可以使用其他方法生成,当然还有更多的循环。