基于 class 层级创建 XML
Create XML based on class hierarchy
我的代码如下:
class GlobalInfo {
// multiple properties here
String name;
GlobalInfo parent;
static hasMany = [children: GlobalInfo]
}
class RegionalInfo extends GlobalInfo {
// multiple properties here
}
class BankInfo extends GlobalInfo {
// multiple properties here
}
一个RegionalInfo可以有多个BankInfo。 BankInfo object.
中可能有多个 RegionalInfo parent
例如,
BankInfo == Bank Of America
RegionalInfo == Dallas // 1st parent
RegionalInfo == Texas // Dallas's parent
RegionalInfo == MidWest // Texas's parent and final parent.
根据以上示例,BankInfo object 的直接 parent 指向达拉斯,parent 指向德克萨斯,然后 parent 指向中西部。
在某些情况下,可能只有一两个parent
例如,
BankInfo == University Credit Union
RegionalInfo == Houston
例如,从最顶层 parent 开始的 class 层次结构视图将如下所示。这只是一个例子,我可以得到任何组合。
<MidWest>
<Independent Bank Of MidWest/>
<Midland Bank Of America/>
<Texas>
<Bank Of America>
<Austin>
<Supereme National Bank>
<Master Chanse Bank>
<Austin East>
<National Bank Of Austin>
<Federal Bank>
</Austin East>
</Austin>
</Texas>
<Kansas>
<Federal Credit Union>
<Kansas State Bank>
</Kansas>
</MidWest>
位置是 RegionalInfo 的 objects,银行是 BankInfo 的 objects。
这里的挑战是,如您所见,一个 RegionalInfo object.
中可能有更多的 RegionalInfo object
下面是我想出的代码。
def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
xml.root(name: "MidWest"){
bank(name: "Independent Bank Of MidWest")
bank(name: "Midland Bank Of America")
location(name: "Texas", expanded: true){
reader(name:"Bank Of America")
location(name: "Austin", expanded: true){
bank(name:"Supereme National Bank")
bank(name:"Master Chanse Bank")
location(name: "Austin East", expanded: true){
bank(name:"National Bank Of Austin")
bank(name:"Federal Bank")
}
}
}
location(name: "Kansas", expanded: true){
bank(name:"Federal Credit Union")
bank(name:"Kansas State Bank")
}
}
这里的问题是一切都是静态创建的。我想动态创建 XML,因为 class object 结构每次都会改变。
可以吗?
创建此 XML 的目的是在 TreeView 插件中使用它从最顶层 parent 绘制 class 层次结构。在上面的例子中,最上面的 parent 是 MidWest.
已更新
XML 为上面的代码生成:
<root name='MidWest'>
<bank name='Independent Bank Of MidWest' />
<bank name='Midland Bank Of America' />
<location name='Texas' expanded='true'>
<bank name='Bank Of America' />
<location name='Austin' expanded='true'>
<bank name='Supereme National Bank' />
<bank name='Master Chanse Bank' />
<location name='Austin East' expanded='true'>
<bank name='National Bank Of Austin' />
<bank name='Federal Bank' />
</location>
</location>
</location>
<location name='Kansas' expanded='true'>
<bank name='Federal Credit Union' />
<bank name='Kansas State Bank' />
</location>
</root>
类似这样的东西(我修改了 类 以便能够 运行 它们独立,通过删除 hasMany)?
import groovy.xml.MarkupBuilder
class GlobalInfo {
String name
GlobalInfo parent
List<GlobalInfo> children
}
class RegionalInfo extends GlobalInfo {
// multiple properties here
}
class BankInfo extends GlobalInfo {
// multiple properties here
}
String root(GlobalInfo root) {
def out = new StringWriter()
MarkupBuilder xml = new MarkupBuilder(out)
xml.root(name: root.name) {
root.children.each {
child(xml, it)
}
}
out.toString()
}
void child(MarkupBuilder xml, RegionalInfo info) {
xml.location(makeAttributes(info)) {
info.children?.each { child(xml, it) }
}
}
void child(MarkupBuilder xml, GlobalInfo info) {
throw new RuntimeException("GlobalInfo not expected here")
}
void child(MarkupBuilder xml, BankInfo info) {
xml.bank(makeAttributes(info))
}
protected LinkedHashMap<String, String> makeAttributes(GlobalInfo info) {
def attrs = [
name: info.name
]
if (info.children) {
attrs.expanded = true
}
attrs
}
def midwest = new GlobalInfo(
name: "MidWest",
children: [
new BankInfo(
name: 'Independent Bank Of MidWest'
),
new RegionalInfo(
name: 'Texas',
children: [
new BankInfo(
name: 'Bank Of America'
),
new RegionalInfo(
name: 'Austin',
children: [
new BankInfo(
name: 'National Bank Of Austin'
)
]
)
]
)
]
)
println root(midwest)
导致:
<root name='MidWest'>
<bank name='Independent Bank Of MidWest' />
<location name='Texas' expanded='true'>
<bank name='Bank Of America' />
<location name='Austin' expanded='true'>
<bank name='National Bank Of Austin' />
</location>
</location>
</root>
我的代码如下:
class GlobalInfo {
// multiple properties here
String name;
GlobalInfo parent;
static hasMany = [children: GlobalInfo]
}
class RegionalInfo extends GlobalInfo {
// multiple properties here
}
class BankInfo extends GlobalInfo {
// multiple properties here
}
一个RegionalInfo可以有多个BankInfo。 BankInfo object.
中可能有多个 RegionalInfo parent例如,
BankInfo == Bank Of America
RegionalInfo == Dallas // 1st parent
RegionalInfo == Texas // Dallas's parent
RegionalInfo == MidWest // Texas's parent and final parent.
根据以上示例,BankInfo object 的直接 parent 指向达拉斯,parent 指向德克萨斯,然后 parent 指向中西部。
在某些情况下,可能只有一两个parent
例如,
BankInfo == University Credit Union
RegionalInfo == Houston
例如,从最顶层 parent 开始的 class 层次结构视图将如下所示。这只是一个例子,我可以得到任何组合。
<MidWest>
<Independent Bank Of MidWest/>
<Midland Bank Of America/>
<Texas>
<Bank Of America>
<Austin>
<Supereme National Bank>
<Master Chanse Bank>
<Austin East>
<National Bank Of Austin>
<Federal Bank>
</Austin East>
</Austin>
</Texas>
<Kansas>
<Federal Credit Union>
<Kansas State Bank>
</Kansas>
</MidWest>
位置是 RegionalInfo 的 objects,银行是 BankInfo 的 objects。
这里的挑战是,如您所见,一个 RegionalInfo object.
中可能有更多的 RegionalInfo object下面是我想出的代码。
def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
xml.root(name: "MidWest"){
bank(name: "Independent Bank Of MidWest")
bank(name: "Midland Bank Of America")
location(name: "Texas", expanded: true){
reader(name:"Bank Of America")
location(name: "Austin", expanded: true){
bank(name:"Supereme National Bank")
bank(name:"Master Chanse Bank")
location(name: "Austin East", expanded: true){
bank(name:"National Bank Of Austin")
bank(name:"Federal Bank")
}
}
}
location(name: "Kansas", expanded: true){
bank(name:"Federal Credit Union")
bank(name:"Kansas State Bank")
}
}
这里的问题是一切都是静态创建的。我想动态创建 XML,因为 class object 结构每次都会改变。
可以吗?
创建此 XML 的目的是在 TreeView 插件中使用它从最顶层 parent 绘制 class 层次结构。在上面的例子中,最上面的 parent 是 MidWest.
已更新
XML 为上面的代码生成:
<root name='MidWest'>
<bank name='Independent Bank Of MidWest' />
<bank name='Midland Bank Of America' />
<location name='Texas' expanded='true'>
<bank name='Bank Of America' />
<location name='Austin' expanded='true'>
<bank name='Supereme National Bank' />
<bank name='Master Chanse Bank' />
<location name='Austin East' expanded='true'>
<bank name='National Bank Of Austin' />
<bank name='Federal Bank' />
</location>
</location>
</location>
<location name='Kansas' expanded='true'>
<bank name='Federal Credit Union' />
<bank name='Kansas State Bank' />
</location>
</root>
类似这样的东西(我修改了 类 以便能够 运行 它们独立,通过删除 hasMany)?
import groovy.xml.MarkupBuilder
class GlobalInfo {
String name
GlobalInfo parent
List<GlobalInfo> children
}
class RegionalInfo extends GlobalInfo {
// multiple properties here
}
class BankInfo extends GlobalInfo {
// multiple properties here
}
String root(GlobalInfo root) {
def out = new StringWriter()
MarkupBuilder xml = new MarkupBuilder(out)
xml.root(name: root.name) {
root.children.each {
child(xml, it)
}
}
out.toString()
}
void child(MarkupBuilder xml, RegionalInfo info) {
xml.location(makeAttributes(info)) {
info.children?.each { child(xml, it) }
}
}
void child(MarkupBuilder xml, GlobalInfo info) {
throw new RuntimeException("GlobalInfo not expected here")
}
void child(MarkupBuilder xml, BankInfo info) {
xml.bank(makeAttributes(info))
}
protected LinkedHashMap<String, String> makeAttributes(GlobalInfo info) {
def attrs = [
name: info.name
]
if (info.children) {
attrs.expanded = true
}
attrs
}
def midwest = new GlobalInfo(
name: "MidWest",
children: [
new BankInfo(
name: 'Independent Bank Of MidWest'
),
new RegionalInfo(
name: 'Texas',
children: [
new BankInfo(
name: 'Bank Of America'
),
new RegionalInfo(
name: 'Austin',
children: [
new BankInfo(
name: 'National Bank Of Austin'
)
]
)
]
)
]
)
println root(midwest)
导致:
<root name='MidWest'>
<bank name='Independent Bank Of MidWest' />
<location name='Texas' expanded='true'>
<bank name='Bank Of America' />
<location name='Austin' expanded='true'>
<bank name='National Bank Of Austin' />
</location>
</location>
</root>