Как убедить groovy.xml.MarkupBuilder создать узел с именем «use» - PullRequest
0 голосов
/ 03 мая 2019

SVG определяет элемент с именем use, и я пытаюсь сгенерировать файл SVG, используя groovy.xml.MarkupBuilder, который использует этот тег:

http://tutorials.jenkov.com/svg/defs-element.html

def writer = new StringWriter()
def xml = new MarkupBuilder(writer)

xml.svg {
    defs {
        g(id:"shape") {
            rect(x:50, y:50, width:50, height:50)
            circle(cx:50, cy:50, r:50)
        }
    }

    use("xlink:href":"#shape", x:50,  y:50")
}

Однакоuse также является ключевым словом в groovy.Как мне избежать этого правильно?

1 Ответ

2 голосов
/ 03 мая 2019

не уверен, что эти методы официальные, однако они работают:

v1:

def xml = new groovy.xml.MarkupBuilder()

xml.svg {
    defs {
        g(id:"shape") {
            rect(x:50, y:50, width:50, height:50)
            circle(cx:50, cy:50, r:50)
        }
    }
    createNode('use',["xlink:href":"#shape", x:50,  y:50])
    //nested elements could be here
    nodeCompleted('svg','use')
}

v2:

def xml = new groovy.xml.MarkupBuilder()

xml.svg {
    defs {
        g(id:"shape") {
            rect(x:50, y:50, width:50, height:50)
            circle(cx:50, cy:50, r:50)
        }
    }

    doInvokeMethod('use','use',[["xlink:href":"#shape", x:50,  y:50], { 
        /*nested elements could be here*/ 
    } ])
}

v3:

мы могли бы переопределить getName метод, который отвечает за сопоставление имен или проверку правил экранирования.

@groovy.transform.CompileStatic
class MyMarkupBuilder  extends groovy.xml.MarkupBuilder{
    def getName(String name){
        if(name.startsWith('__'))return name.substring(2)
        return name
    }
}

def xml = new MyMarkupBuilder()

xml.svg {
    defs {
        g(id:"shape") {
            rect(x:50, y:50, width:50, height:50)
            circle(cx:50, cy:50, r:50)
        }
    }
    __use("xlink:href":"#shape", x:50,  y:50)
}
...