如何解决我有一个要素模型以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>
我想自动生成模型类,但这是我使用过的类以及我获得的输出:
FeatureModel.java
public class FeatureModel {
@XmlElement(name="struct")
private Struct struct;
public Struct getStruct ()
{
return struct;
}
public void setStruct (Struct struct)
{
this.struct = struct;
}
.....
}
Struct.java
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;
}
...........
}
And.java
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;
}
.......
}
Or.java
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;
}
......
}
Feature.java
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 = SvgMapApp,强制= true,feature = [Feature [name = L2Build],Feature [name = USStates],Feature [name = Base]]] [alt = null或= null ]]]]
解决方法
关于调整生成的Java代码,请查看每个元素可以确切包含什么以及缺少什么。例如,xml中的and
元素包含feature
或and
(或两者);在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
正是所缺少的。我还假设有几个or
和alt
是可能的(因此它们应该是数组字段),但是它们根本不在xml中,所以我想它们来自另一个文件-您必须亲自了解它们的适应方式。
feature
似乎总是有一个名称,但有时还有一个hidden
和mandatory
属性,因此请将它们添加到Feature
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。