将列表解组为类型
Unmarshal List to Types
我有这个xml
<data-set>
<list-property name="columns">...</list-property>
<list-property name="resultSet">...</list-property>
<data-set>
需要将其解组为对象:
public class DataSet {
private Columns columns;
private ResultSet resultSet;
...
}
如果可能,请帮助我实现它。
更新
我尝试做的事情:
public class DataSet {
@XmlElement("list-property")
@XmlJavaTypeAdapter(DataSetListPropertyAdapter.class)
private Columns columns;
@XmlElement("list-property")
@XmlJavaTypeAdapter(DataSetListPropertyAdapter.class)
private ResultSet resultSet;
...
}
public class DataSetListPropertyAdapter extends XmlAdapter<ListProperty, ListProperty> {
@Override
public ListProperty unmarshal(ListProperty v) throws Exception {
ListProperty listProperty;
switch (v.getName()) {
case "columns":
listProperty = new Columns();
break;
case "resultSet":
listProperty = new ResultSet();
break;
default:
listProperty = new ListProperty();
}
listProperty.setStructure(v.getStructure());
return listProperty;
}
@Override
public ListProperty marshal(ListProperty v) throws Exception {
return v;
}
}
public class Columns extends ListProperty {
public Columns() {
name = "columns";
}
}
public class ListProperty extends NamedElement implements PropertyType{
@XmlElement(name = "structure")
private List<Structure> structure = new ArrayList<>();
}
@XmlTransient
public class NamedElement {
@XmlAttribute(name = "name", required = true)
protected String name;
}
当去编组时,只有注释对象的第一个元素被解析。另一个为空。当我首先评论然后第二个被解析时。
我认为您尝试使用 JAXB 参考实现是不可能的。
但是,如果您可以更改实现,EclipseLink MOXy 提供的 @XmlPath 应该可以解决您的问题:
public class DataSet {
@XmlPath("node[@name='columns']")
@XmlJavaTypeAdapter(DataSetListPropertyAdapter.class)
private Columns columns;
@XmlPath("node[@name='resultSet']")
@XmlJavaTypeAdapter(DataSetListPropertyAdapter.class)
private ResultSet resultSet;
...
}
有关@XmlPath 的更多信息:http://www.eclipse.org/eclipselink/documentation/2.4/moxy/advanced_concepts005.htm
我有这个xml
<data-set>
<list-property name="columns">...</list-property>
<list-property name="resultSet">...</list-property>
<data-set>
需要将其解组为对象:
public class DataSet {
private Columns columns;
private ResultSet resultSet;
...
}
如果可能,请帮助我实现它。
更新 我尝试做的事情:
public class DataSet {
@XmlElement("list-property")
@XmlJavaTypeAdapter(DataSetListPropertyAdapter.class)
private Columns columns;
@XmlElement("list-property")
@XmlJavaTypeAdapter(DataSetListPropertyAdapter.class)
private ResultSet resultSet;
...
}
public class DataSetListPropertyAdapter extends XmlAdapter<ListProperty, ListProperty> {
@Override
public ListProperty unmarshal(ListProperty v) throws Exception {
ListProperty listProperty;
switch (v.getName()) {
case "columns":
listProperty = new Columns();
break;
case "resultSet":
listProperty = new ResultSet();
break;
default:
listProperty = new ListProperty();
}
listProperty.setStructure(v.getStructure());
return listProperty;
}
@Override
public ListProperty marshal(ListProperty v) throws Exception {
return v;
}
}
public class Columns extends ListProperty {
public Columns() {
name = "columns";
}
}
public class ListProperty extends NamedElement implements PropertyType{
@XmlElement(name = "structure")
private List<Structure> structure = new ArrayList<>();
}
@XmlTransient
public class NamedElement {
@XmlAttribute(name = "name", required = true)
protected String name;
}
当去编组时,只有注释对象的第一个元素被解析。另一个为空。当我首先评论然后第二个被解析时。
我认为您尝试使用 JAXB 参考实现是不可能的。
但是,如果您可以更改实现,EclipseLink MOXy 提供的 @XmlPath 应该可以解决您的问题:
public class DataSet {
@XmlPath("node[@name='columns']")
@XmlJavaTypeAdapter(DataSetListPropertyAdapter.class)
private Columns columns;
@XmlPath("node[@name='resultSet']")
@XmlJavaTypeAdapter(DataSetListPropertyAdapter.class)
private ResultSet resultSet;
...
}
有关@XmlPath 的更多信息:http://www.eclipse.org/eclipselink/documentation/2.4/moxy/advanced_concepts005.htm