【问题标题】:Create XML based on class hierarchy基于类层次结构创建 XML
【发布时间】:2015-05-12 18:16:19
【问题描述】:

我的代码如下:

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
}

一个区域信息中可能有多个银行信息。在 BankInfo 对象中可能有多个 RegionInfo 父级。

例如,

BankInfo == Bank Of America

RegionalInfo == Dallas // 1st parent

RegionalInfo == Texas // Dallas's parent

RegionalInfo == MidWest // Texas's parent and final parent.

根据上面的示例,BankInfo 对象的直接父级指向达拉斯,它的父级指向德克萨斯州,然后它的父级指向中西部。

在某些情况下,可能只有一两个父母

例如,

BankInfo == University Credit Union

RegionalInfo == Houston

例如,来自最高父级的类层次结构视图将如下所示。这只是一个例子,我可以得到任何组合。

<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的对象,银行是BankInfo的对象。

这里的挑战是,正如您所见,一个 RegionInfo 对象中可能有更多的 RegionalInfo 对象。

下面是我想出的代码。

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,因为类对象结构每次都会改变。

有可能吗?

创建这个 XML 的目的是在 TreeView 插件中使用它从最顶层的父级中绘制一个类层次结构。在上面的示例中,最上面的父级是 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>

【问题讨论】:

    标签: xml grails markupbuilder


    【解决方案1】:

    类似这样的东西(我通过删除 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>
    

    【讨论】:

    • 这绝对是在 XML 中获取所有内容。但不是 TreeView 插件所期望的 XML 格式。该格式在我原来的问题中给出。你知道出了什么问题吗?对于需要在树视图中展开的元素,它还应该具有“预期:真”。
    • 请参阅下面为我的原始问题中的代码生成的 XML。 `
    • 请参阅原始问题的更新部分。
    • 你来了,我更新了你要求的格式的答案
    • 请注意,您的数据中没有任何信息可以帮助我推断“读者”元素。但是您应该能够从您的完整模型中自行扩展它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 2017-08-19
    相关资源
    最近更新 更多