Reputation: 315
I am new to Jaxb and having problem parsing a simple XML. The XML in question is shown below:
<tables>
<table id="1" >
<schema>validator_test</schema>
<name>test1</name>
<rowCountToValidate>6</rowCountToValidate>
<columnTypeCheckRequired>FALSE</columnTypeCheckRequired>
<additionalColumns>column1,column2</additionalColumns>
</table>
<table id="2">
<schema>validator_test</schema>
<name>validate_external1</name>
<rowCountToValidate>2</rowCountToValidate>
<columnTypeCheckRequired>FALSE</columnTypeCheckRequired>
<additionalColumns>column1,column2</additionalColumns>
</table>
<table id="3">
<schema>validator_test</schema>
<name>Test_View1</name>
<rowCountToValidate>2</rowCountToValidate>
<columnTypeCheckRequired>FALSE</columnTypeCheckRequired>
<additionalColumns>column1,column2</additionalColumns>
</table>
</tables>
The Jaxb class to unmarshall this is:-
@XmlRootElement(name = "table")
@XmlType(propOrder = { "name", "schema", "rowCountToValidate","columnTypeCheckRequired","additionalColumns","targetName"})
@Service
public class TableInfo {
private static final boolean TRUE = true;
@Value("${default.row.count.to.validate}")
private Integer defaultRowCountToValidate;
/**
*
*/
public TableInfo() {
}
private String name;
private String schema;
private Integer rowCountToValidate;
private String targetName;
private String columnTypeCheckRequired;
private String additionalColumns;
@XmlElement(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement(name = "schema")
public String getSchema() {
return schema;
}
public void setSchema(String schema) {
this.schema = schema;
}
@XmlElement(name = "rowCountToValidate")
public Integer getRowCountToValidate() {
return rowCountToValidate;
}
@XmlElement(name = "columnTypeCheckRequired")
public String getColumnTypeCheckRequired() {
return columnTypeCheckRequired;
}
public void setColumnTypeCheckRequired(String columnTypeCheckRequired) {
this.columnTypeCheckRequired = columnTypeCheckRequired;
}
@XmlElement(name = "additionalColumns")
public String getAdditionalColumns() {
return additionalColumns;
}
public void setAdditionalColumns(String additionalColumns) {
this.additionalColumns = additionalColumns;
}
public void setRowCountToValidate(Integer rowCountToValidate) {
// If user configured value is not null and greater than zero then set
// the value otherwise use default value
if ((null != rowCountToValidate) && (rowCountToValidate.intValue() > 0)) {
this.rowCountToValidate = rowCountToValidate;
}else {
this.rowCountToValidate = defaultRowCountToValidate;
}
}
@XmlElement(name = "targetName")
public String getTargetName() {
return targetName;
}
public void setTargetName(String targetName) {
this.targetName = targetName;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
However, I am ggetting the following exception:-
`JAXB unmarshalling exception; nested exception is javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"tables"). Expected elements are <{tables}table>`
I would really appreciate if someone can point out the error I am doing. I am new to this and am not really able to understand how jaxb works.
Upvotes: 0
Views: 85
Reputation: 658
@XmlRootElement(name = "table")
<tables>
<table id="1" >
Below are the 2 solution for above issue:
And table should be in the form of list in tables class.
Upvotes: 1
Reputation: 142
in your code root element is @XmlRootElement(name = "table") where in your XML file it is "tables"
Suggest you to use xjc command to build java POJO classes automatically
xjc -d -p sample.xsd -d to define where the generated classes shall be stored in the file system, -p to define the package to be used
Upvotes: 0
Reputation: 2580
You need to create class Tables
with @XmlRootElement(name = "tables")
and that class must contain table
field with type TableInfo
.
When you unmarshal example xml, you need to pass Tables
class to unmarshaller.
Upvotes: 1