Groovy 从树状结构递归创建xml

Groovy 从树状结构递归创建xml,groovy,Groovy,我有树状的结构 class FSNode { FSEntity data def parent def children = [] boolean isRoot() { parent == null } } 我这样实例化它 // create filesystem folder def fsEntityDirectory = new FSEntity(name: 'folder') def fsDirectoryNode = new F

我有树状的结构

class FSNode {
    FSEntity data
    def parent
    def children = []

    boolean isRoot() {
        parent == null
    }
}
我这样实例化它

// create filesystem folder
def fsEntityDirectory = new FSEntity(name: 'folder')
def fsDirectoryNode = new FSNode(parent: null, data: fsEntityDirectory)

def fsEntityDirectory2 = new FSEntity(name: 'folder1')
def fsDirectoryNode2 = new FSNode(parent: fsDirectoryNode, data: fsEntityDirectory2)

// create filesystem file
def fsEntity = new FSEntity(name: 'basic.txt', size: 10) // file system entity
def fsEntityNode = new FSNode(data: fsEntity, parent: fsDirectoryNode)

def fsEntity2 = new FSEntity(name: 'file.png', size: 12)
def fsEntityNode2 = new FSNode(data: fsEntity2, parent: fsDirectoryNode2)
fsDirectoryNode2.children << fsEntityNode2

fsDirectoryNode.children << fsDirectoryNode2
fsDirectoryNode.children << fsEntityNode
<filesystem-root>
    <directory name="folder">
        <directory name="folder1">
            <file name="file.png" size="12" />
        </directory>
        <file name="basic.txt" size="10" />
    </directory>
</filesystem-root>
但最终我得到了

<directory name='folder' />
<directory name='folder1' />
<file name='file.png' size='12' />
<file name='basic.txt' size='10' />


有什么问题吗?

您可以尝试以下方法:

def serializeFSNode(FSNode node, MarkupBuilder m) {
    if(node.children) {
        m.directory(name: node.data.name) {
            node.children.each { child ->
                serializeFSNode(child, m)
            }
        }
    }
    else {
        m."${node.data.size ? 'file' : 'directory'}"(name: node.data.name, size: node.data.size)
    }
}

哦,我没有想到卷发背带。谢谢
def serializeFSNode(FSNode node, MarkupBuilder m) {
    if(node.children) {
        m.directory(name: node.data.name) {
            node.children.each { child ->
                serializeFSNode(child, m)
            }
        }
    }
    else {
        m."${node.data.size ? 'file' : 'directory'}"(name: node.data.name, size: node.data.size)
    }
}