我有一个功能模型(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 楼答案
至于调整生成的Java代码,请查看每个元素可以包含哪些内容以及缺少哪些内容。例如,xml中的
and
元素包含feature
或and
元素(或两者都包含);在And
类中,只有Feature
列表的成员存在,因此手动添加and
这也应该涵盖更深嵌套级别中的
and
。看看您的输出,and
正是缺少的。我还假设有几个or
和alt
是可能的(因此这些应该是数组字段),但这些字段在xml中根本不存在,所以我猜它们来自另一个文件-您必须亲自看看它们如何适应feature
似乎总是有一个名称,但有时也有一个hidden
和mandatory
属性,所以将它们添加到Feature