有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

我有一个功能模型(xml格式)。当遍历所需的特性时,是否有方法为任何给定的特性模型生成java类?

我尝试使用JAXB读取XML文件,但它只读取第一级元素。我也不知道如何为XML文件中的每个必需特性生成java类。下面是我正在使用的一个示例特征模型,以及我从读取文件中获得的输出

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
        <featureModel>
            <struct>
                <and abstract="true" mandatory="true" name="SvgMapApp">
                    <feature name="L2Build"/>
                    <and abstract="true" mandatory="true" name="Layers">
                        <feature name="ColorRegion"/>
                        <feature name="Relief"/>
                        <feature name="Rivers"/>
                        <feature name="Lakes"/>
                        <feature name="PopCircle"/>
                    </and>
                    <and abstract="true" mandatory="true" name="Legends">
                        <and abstract="true" name="Controls">
                            <feature name="Navigator"/>
                            <feature name="ReliefControls"/>
                            <feature name="RiverControls"/>
                            <feature name="LakeControls"/>
                            <feature name="PopCircleControls"/>
                            <feature name="CoordinateDisplay"/>
                        </and>
                        <and abstract="true" name="Stats1">
                            <feature name="AgeChart"/>
                            <feature name="StatsMedianAge"/>
                            <feature name="EthnicBarChart"/>
                            <feature name="EthnicPieChart"/>
                        </and>
                        <and abstract="true" name="Stats2">
                            <feature name="StatsSex"/>
                            <feature name="StatsHouseholds"/>
                            <feature name="StatsPopulation"/>
                        </and>
                        <feature hidden="true" name="Legend"/>
                    </and>
                    <feature hidden="true" mandatory="true" name="USStates"/>
                    <feature mandatory="true" name="Base"/>
                </and>
            </struct>
            <constraints>
                <rule>
                    <imp>
                        <var>PopCircleControls</var>
                        <var>PopCircle</var>
                    </imp>
                </rule>
                <rule>
                    <imp>
                        <var>ReliefControls</var>
                        <var>Relief</var>
                    </imp>
                </rule>
                <rule>
                    <imp>
                        <var>RiverControls</var>
                        <var>Rivers</var>
                    </imp>
                </rule>
                <rule>
                    <imp>
                        <var>LakeControls</var>
                        <var>Lakes</var>
                    </imp>
                </rule>
                <rule>
                    <imp>
                        <var>Controls</var>
                        <var>Legend</var>
                    </imp>
                </rule>
                <rule>
                    <imp>
                        <var>Stats1</var>
                        <var>Legend</var>
                    </imp>
                </rule>
                <rule>
                    <imp>
                        <var>Stats2</var>
                        <var>Legend</var>
                    </imp>
                </rule>
                <rule>
                    <imp>
                        <var>L2Build</var>
                        <not>
                            <var>EthnicBarChart</var>
                        </not>
                    </imp>
                </rule>
            </constraints>
            <comments>
                <c> this turns panel a off</c>
                <c> this turns panel a off</c>
                <c>Layers { tab }</c>
                <c>Legends { out="" }</c>
                <c>Controls { tab }</c>
                <c>Stats1 { tab }</c>
                <c>Stats2 { tab }</c>
            </comments>
        </featureModel>

我想自动生成模型类,但以下是我使用过的类和获得的输出:

特征模型。爪哇

public class FeatureModel {
    
     @XmlElement(name="struct")
     private Struct struct;

       

        public Struct getStruct ()
        {
            return struct;
        }

        public void setStruct (Struct struct)
        {
            this.struct = struct;
        }

       .....
        
}

结构。爪哇

public class Struct {
    
    @XmlElement(name="and")

    private And and[];
    
    public And[] getAnd ()
    {
        return and;
    }

    public void setAnd (And[] and)
    {
        this.and = and;
    }

    .........
    
    
}

Alt.java

public class Alt {
    @XmlElement(name="feature")
    private Feature[] feature;
    
    @XmlAttribute
    private String name;

   
    @XmlAttribute
    private String mandatory;

    public Feature[] getFeature ()
    {
        return feature;
    }

    public void setFeature (Feature[] feature)
    {
        this.feature = feature;
    }

    public String getName ()
    {
        return name;
    }

    public void setName (String name)
    {
        this.name = name;
    }

    
    public String getMandatory ()
    {
        return mandatory;
    }

    public void setMandatory (String mandatory)
    {
        this.mandatory = mandatory;
    }

    ...........
}

和。爪哇

public class And {
    
    @XmlAttribute
    private String name;
    
    @XmlAttribute
    private String mandatory;
    

    @XmlElement(name="feature")
    private Feature[] feature;
     
    @XmlElement(name="or")
    private Or or;

    @XmlElement(name="alt")
    private Alt alt;
    
    public String getName ()
        {
            return name;
        }

    public void setName (String name)
        {
            this.name = name;
        }
    public Feature[] getFeature ()
        {
            return feature;
        }

    public void setFeature (Feature[] feature)
        {
            this.feature = feature;
        }

    public Or getOr ()
    {
        return or;
    }

    public void setOr (Or or)
    {
        this.or = or;
    }

    public Alt getAlt ()
    {
        return alt;
    }

    public void setAlt (Alt alt)
    {
        this.alt = alt;
    }

  
    public String getMandatory ()
    {
        return mandatory;
    }

    public void setMandatory (String mandatory)
    {
        this.mandatory = mandatory;
    }

    .......
        
}

或者。爪哇

public class Or {
    
    @XmlElement(name="feature")
    private Feature[] feature;
    
    @XmlAttribute
    private String name;

    public Feature[] getFeature ()
    {
        return feature;
    }

    public void setFeature (Feature[] feature)
    {
        this.feature = feature;
    }

    public String getName ()
    {
        return name;
    }

    public void setName (String name)
    {
        this.name = name;
    }

    ......
}

特色。爪哇

public class Feature {
    
    @XmlAttribute
     private String name;

        public String getName ()
        {
            return name;
        }

        public void setName (String name)
        {
            this.name = name;
        }

        ...............
}

以下是我的输出: FeatureModel[struct=struct[and=[and Root=svgmapap,mandatory=true,feature=[feature[name=L2Build],feature[name=USStates],feature[name=Base]][alt=null,or=null]]


共 (1) 个答案

  1. # 1 楼答案

    至于调整生成的Java代码,请查看每个元素可以包含哪些内容以及缺少哪些内容。例如,xml中的and元素包含featureand元素(或两者都包含);在And类中,只有Feature列表的成员存在,因此手动添加and

    public class And {
        
        @XmlAttribute
        private String name;
        
        @XmlAttribute
        private String mandatory;
        
    
        @XmlElement(name="feature")
        private Feature[] feature;
         
        @XmlElement(name="or")
        private Or or;
    
        @XmlElement(name="alt")
        private Alt alt;
    
        // added
        @XmlElement(name="and")
        private And[] and;
    }
    

    这也应该涵盖更深嵌套级别中的and。看看您的输出,and正是缺少的。我还假设有几个oralt是可能的(因此这些应该是数组字段),但这些字段在xml中根本不存在,所以我猜它们来自另一个文件-您必须亲自看看它们如何适应

    feature似乎总是有一个名称,但有时也有一个hiddenmandatory属性,所以将它们添加到Feature