【问题标题】:Nested XML schema, how to use JAXB?嵌套 XML 模式,如何使用 JAXB?
【发布时间】:2019-02-20 10:03:51
【问题描述】:

我面临一个相当大的问题,因为即使我正确使用 JAXB API 将 xml 字符串映射到 java 对象,我也会卡住。 为了节省时间,我不会写真正的字段,而是我的 XML 的一般模式:

<A>
   <B>
      <B1></B1>
      <B2></B2>
      <B3></B3>   
      <B4></B4>
      <C>  
         <D>
            <D1></D1>
            <D2></D2> 
         </D>
      </C>
      <B5></B5>
      <B6></B6>
   </B>
   <E> 
      <F>
         <F1></F1>
         <F2></F2>
         <F3></F3>
      </F> 
   </E>
   <G> 
      <G1></G1>
      <G2></G2>
      <G3></G3>
    </G>
</A>

所以在这种情况下,我有一个 A 类构建,

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

   @XmlElement(name = "B")
   private B objB;


   @XmlElement(name = "C")
   private String objC= "";

   @XmlElement(name = "E")
   private String objE= "";

   @XmlElement(name = "F")
   private F objF;

   @XmlElement(name = "D")
   private D objD;

   @XmlElement(name = "G")
   private G objG;

因此,包装类 A 具有与 XML 的适当部分相关的对象属性。因此,每个字母都有自己的类,代表我项目中的一个对象。 使用这个:

JAXBContext jaxbContext = JAXBContext.newInstance(A.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

StringReader reader = new StringReader("xml string here");
A element= (A) unmarshaller.unmarshal(reader);

我无法在我的自定义嵌套对象中正确映射我的 xml 字符串。所以我的目标是在 A 类中映射整个 xml 字符串,该类将自动映射其属性,这些属性也是字符串的 xml 部分。我还为每个子类中的每个属性声明注释 @Xmlelement。最后,E 和 C 没有适当的类,因为它们分别充当 D 类和 F 类的一种分隔符,因此它们在主类 A 中被简单地声明为字符串。

我从未将 JAXB 用于如此复杂的数据模型,所以我不知道如何进行。非常感谢愿意回复的人。

【问题讨论】:

    标签: java xml jaxb


    【解决方案1】:

    导入 javax.xml.bind.annotation.XmlElement; 导入 javax.xml.bind.annotation.XmlRootElement;

    @XmlRootElement(name = "A") 公共类 A {

    private B b;
    
    private E e;
    
    private G g;
    
    @XmlElement(name = "B")
    public B getB() {
        return b;
    }
    
    public void setB(B b) {
        this.b = b;
    }
    
    @XmlElement(name = "E")
    public E getE() {
        return e;
    }
    
    public void setE(E e) {
        this.e = e;
    }
    
    @XmlElement(name = "G")
    public G getG() {
        return g;
    }
    
    public void setG(G g) {
        this.g = g;
    }
    

    }

    导入 javax.xml.bind.annotation.XmlElement;

    公共B类{

    private String B1;
    
    private String B2;
    private String B3;
    private String B4;
    private C c;
    private D d;
    private String B5;
    private String B6;
    
    @XmlElement(name = "B1")
    public String getB1() {
        return B1;
    }
    
    public void setB1(String b1) {
        B1 = b1;
    }
    
    @XmlElement(name = "B2")
    public String getB2() {
        return B2;
    }
    
    public void setB2(String b2) {
        B2 = b2;
    }
    
    @XmlElement(name = "B3")
    public String getB3() {
        return B3;
    }
    
    public void setB3(String b3) {
        B3 = b3;
    }
    
    @XmlElement(name = "B4")
    public String getB4() {
        return B4;
    }
    
    public void setB4(String b4) {
        B4 = b4;
    }
    
    @XmlElement(name = "C")
    public C getC() {
        return c;
    }
    
    public void setC(C c) {
        this.c = c;
    }
    
    @XmlElement(name = "B5")
    public String getB5() {
        return B5;
    }
    
    public void setB5(String b5) {
        B5 = b5;
    }
    
    @XmlElement(name = "B6")
    public String getB6() {
        return B6;
    }
    
    public void setB6(String b6) {
        B6 = b6;
    }
    

    }

    导入 javax.xml.bind.annotation.XmlElement; 导入 javax.xml.bind.annotation.XmlRootElement;

    @XmlRootElement(name = "C") 公共类 C {

    private D d;
    
    @XmlElement(name = "D")
    public D getD() {
        return d;
    }
    
    public void setD(D d) {
        this.d = d;
    }
    

    }

    导入 javax.xml.bind.annotation.XmlElement; 导入 javax.xml.bind.annotation.XmlRootElement;

    @XmlRootElement(name = "D") 公共类 D {

    private String D1;
    private String D2;
    
    @XmlElement(name = "D1")
    public String getD1() {
        return D1;
    }
    
    public void setD1(String d1) {
        D1 = d1;
    }
    
    @XmlElement(name = "D2")
    public String getD2() {
        return D2;
    }
    
    public void setD2(String d2) {
        D2 = d2;
    }
    

    }

    导入 javax.xml.bind.annotation.XmlElement; 导入 javax.xml.bind.annotation.XmlRootElement;

    @XmlRootElement(name = "E") 公共类 E {

    private F f;
    
    @XmlElement(name = "F")
    public F getF() {
        return f;
    }
    
    public void setF(F f) {
        this.f = f;
    }
    

    }

    导入 javax.xml.bind.annotation.XmlElement;

    公共类 F {

    private String F1;
    private String F2;
    private String F3;
    
    @XmlElement(name = "F1")
    public String getF1() {
        return F1;
    }
    
    public void setF1(String f1) {
        F1 = f1;
    }
    
    @XmlElement(name = "F2")
    public String getF2() {
        return F2;
    }
    
    public void setF2(String f2) {
        F2 = f2;
    }
    
    @XmlElement(name = "F3")
    public String getF3() {
        return F3;
    }
    
    public void setF3(String f3) {
        F3 = f3;
    }
    

    }

    导入 javax.xml.bind.annotation.XmlElement;

    公共类 G {

    private String G1;
    
    
    private String G2;
    private String G3;
    
    @XmlElement(name = "G1")
    public String getG1() {
        return G1;
    }
    
    public void setG1(String g1) {
        G1 = g1;
    }
    
    @XmlElement(name = "G2")
    public String getG2() {
        return G2;
    }
    
    public void setG2(String g2) {
        G2 = g2;
    }
    
    @XmlElement(name = "G3")
    public String getG3() {
        return G3;
    }
    
    public void setG3(String g3) {
        G3 = g3;
    }
    

    }

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
    • 谢谢先生。我将使用此数据模型再次尝试我的代码。还有两件事:如果 D 可以重复(D 类的对象数组)并且 F 也可以重复呢?为什么有些类如 G 没有@XmlRootElement?
    • 如果要重复 D 和 F,则必须采用 D 对象的数组列表。@XmlRootElement 可以跳过嵌套对象,因为它用作 xml 文件的顶级(根)级别。
    • JAXB 是一个 java 标准,通过它我们可以将 java 对象转换为 xml 结构。在上面的示例中,A 类是顶级类,它是 xml 文件的根元素。对于任何 xml 标记例如 我们必须定义一个类。由于 A 类有多个嵌套的 xml 标签,因此为每个标签定义了多个 java 类。
    猜你喜欢
    • 2021-10-20
    • 2017-08-21
    • 1970-01-01
    • 2014-09-05
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 2012-09-24
    相关资源
    最近更新 更多