2016-11-21 106 views
0

我是Jaxb的新手,並且解析簡單的XML時出現問題。存在問題的XML如下所示:JAXB umarshall例外

<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> 

的JAXB類來解讀是這樣的: -

@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); 
    } 
} 

不過,我ggetting以下異常: -

`JAXB unmarshalling exception; nested exception is javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"tables"). Expected elements are <{tables}table>` 

我會非常感謝,如果有人能指出我正在做的錯誤。我對此很陌生,而且真的無法理解jaxb是如何工作的。

+0

首先爲您的XML獲取'XSD',然後'生成POJO '從那個'XSD',然後去取消/編組XML。僅供參考..你的根元素應該是'表'和'不是表' – Swaraj

+1

@Swaraj沒有必要XSD和它的編譯。你可以手動編寫和註釋POJO。 – lexicore

+0

@lexicore正確。我正在以傳統的方式去。 – Swaraj

回答

1

您需要創建類別Tables@XmlRootElement(name = "tables"),該類別必須包含table字段,其​​中的類型爲TableInfo

解組示例xml時,需要將Tables類傳遞給unmarshaller。

1
@XmlRootElement(name = "table") 
<tables> 
<table id="1" > 

以下是上述問題的解決方案2:

  1. 你需要使用XSD生成的類。
  2. 您需要根據您所需的XML生成類:在XML表中的 位於表內,因此表應該是根元素。

而且表格應該以表格類的列表形式。

代碼中的根元素
0

是@XmlRootElement(NAME =「表」)在你的XML文件,其中是「表」

建議您使用XJC命令來構建Java POJO類自動

XJC -d -p sample.xsd -d定義生成的類在文件系統中的存儲位置, -p定義要使用的程序包