英文:
I have a feature model (in xml format). Is there a way to generate java classes for any given feature model when a required feature is traversed?
问题
以下是您提供的内容的翻译部分:
我尝试使用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>
<!-- 约束规则部分已省略 -->
<!-- 注释部分已省略 -->
</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;
// ...
}
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;
// ...
}
Or.java
public class Or {
@XmlElement(name="feature")
private Feature[] feature;
@XmlAttribute
private String name;
// ...
}
Feature.java
public class Feature {
@XmlAttribute
private String name;
// ...
}
这是我得到的输出:
FeatureModel [struct = Struct [and = [And Root = SvgMapApp, mandatory = true, feature = [Feature [name = L2Build], Feature [name = USStates], Feature [name = Base]] [alt = null, or = null]]]]
英文:
I have tried reading the XML file using JAXB but it only reads the first-level elements. I also do not know how to go about generating the java classes for each of the required features in the XML file. Here is a sample feature model that I am working with and the output I have obtained from reading the file.
<?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>
I would like to autogenerate the model classes, but here are the classes I have worked with and the output I obtained:
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;
}
...............
}
Here is my output:
FeatureModel [struct = Struct [and = [And Root = SvgMapApp, mandatory = true, feature = [Feature [name = L2Build], Feature [name = USStates], Feature [name = Base]] [alt = null, or = null]]]]
答案1
得分: 0
Sure, here's the translated Java code part you provided:
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;
}
Let me know if you need anything else!
英文:
As for adjusting the generated Java code, look at what exactly each element can contain and what is missing. For instance, the and
elements in the xml contain either feature
s or and
s (or both); in the And
class, only a member for a list of Feature
s is present, so add the and
s manually.
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;
}
This should also cover the and
s in the deeper nested levels. Looking at your output, the and
s are exactly what are missing. I would also assume several or
s and alt
s are possible (so those should be array fields), but those aren't present in the xml at all, so I guess they come from another file - you'll have to see for yourself how they fit in.
The feature
seems to always have a name, but also a hidden
and mandatory
attribute sometimes, so add those to Feature
.
专注分享java语言的经验与见解,让所有开发者获益!
评论