2015-06-30 75 views
0

如何創建使用JAXB此XML文件的Java對象的Java對象,轉換XML文件來使用JAXB

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<Parameters> 
<Varremise> 
    <Name>Amazigh</Name> 
    <Var>Notprovided</Var> 
    <Var>Notprovided</Var>  
</Varremise> 
<Varheader> 
    <Name>CdAppOr</Name> 
    <Var>P</Var> 
    <Var>A</Var> 
    <Var>O</Var> 
</Varheader> 
<Vardetail> 
    <Name>TopUC</Name> 
    <Var>U</Var> 
    <Var>C</Var> 
</Vardetail> 
</Parameters> 

我有嘗試用這個,但它不工作,

參數類:

import java.util.Set; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlElementWrapper; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "parametersContainer") 
@XmlRootElement(name = "Parameters") 
public class Parameters { 

@XmlElement(name = "Varremise") 
@XmlElementWrapper(name = "Varremise") 
private Set<VarRemise> varremise; 

@XmlElement(name = "Varheader") 
@XmlElementWrapper(name = "Varheader") 
private Set<VarHeader> varheader; 

@XmlElement(name = "Vardetail") 
@XmlElementWrapper(name = "Vardetail") 
private Set<VarDetail> vardetail; 


public Set<VarHeader> getVarheader() { 
    return varheader; 
} 

public void setVarheader(final Set<VarHeader> varheader) { 
    this.varheader = varheader; 
} 

public Set<VarDetail> getVardetail() { 
    return vardetail; 
} 

public void setVardetail(final Set<VarDetail> vardetail) { 
    this.vardetail = vardetail; 
} 

public Set<VarRemise> getVarremise() { 
    return varremise; 
} 

public void setVarremise(final Set<VarRemise> varremise) { 
    this.varremise = varremise; 
} 

} 

AllVarsDefinition類:

import java.util.Set; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public abstract class AllVarsDefinition { 

@XmlElement(name = "Name", required = true) 
private String name; 

@XmlElement(name = "Var", required = true) 
private Set<String> var; 

public String getName() { 
    return name; 
} 

public void setName(final String name) { 
    this.name = name; 
} 

public Set<String> getVar() { 
    return var; 
} 

public void setVar(final Set<String> var) { 
    this.var = var; 
} 

} 

VarHeader類:

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class VarHeader extends AllVarsDefinition { 

} 

相同的代碼來Vardetail和varRemise類,

當我EXCUTE此代碼它創建一個空的對象

謝謝

回答

0

參數類

import java.util.List; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name = "Parameters") 
public class Parameters { 


@XmlElement(name = "Varremise") 
private List<VarRemise> varremise; 


public List<VarRemise> getVarremise() { 
    return varremise; 
} 

public void setVarremise(final List<VarRemise> varremise) { 
    this.varremise = varremise; 
} 

@XmlElement(name = "Varheader") 
private List<VarHeader> varheader; 

@XmlElement(name = "Vardetail") 
private List<VarDetail> vardetail; 

public List<VarHeader> getVarheader() { 
    return varheader; 
} 

public void setVarheader(final List<VarHeader> varheader) { 
    this.varheader = varheader; 
} 

public List<VarDetail> getVardetail() { 
    return vardetail; 
} 

public void setVardetail(final List<VarDetail> vardetail) { 
    this.vardetail = vardetail; 
} 

} 

VarRemise類

import java.util.Set; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 


@XmlAccessorType(XmlAccessType.FIELD) 
public class VarRemise { 


@XmlElement(name = "Name", required = true) 
private String name; 

@XmlElement(name = "Var", required = true) 
private Set<String> vars; 

public String getName() { 
    return name; 
} 

public void setName(final String name) { 
    this.name = name; 
} 

public Set<String> getVars() { 
    return vars; 
} 

public void setVars(final Set<String> vars) { 
    this.vars = vars; 
} 

} 

相同的代碼來vardetail和varhead類,並將其工作

謝謝cvesters

0

的問題是,你的XML不是預期的。 您已經指定了一個包裝和一個具有相同名稱的元素。

@XmlElement(name = "Varheader") 
@XmlElementWrapper(name = "Varheader") 

實際期望的XML的形式爲:

<Varheader> 
    <Varheader></Varheader> 
</Varheader> 

編輯:

基於一些意見的解決方案應該是:

  • 取出WrapperElements
  • 將設置更改爲列表,JAXB將自動以這種方式解析列表。
+0

謝謝您回答,現在它返回null,而不是空對象 – darkman

+0

當我刪除包裝它工作,謝謝 – darkman

+0

我不認爲去除包裝解決所有問題。我不認爲你現在可以在列表中指定多個元素。也許你應該嘗試一下。 – cvesters