Java 嵌套XML模式,如何使用JAXB?

Java 嵌套XML模式,如何使用JAXB?,java,xml,jaxb,Java,Xml,Jaxb,我面临着一个相当大的问题,因为即使我正确地使用JAXB API将xml字符串映射到java对象,我也会陷入困境。 为了节省时间,我将不编写实际字段,而是编写XML的通用模式: <A> <B> <B1></B1> <B2></B2> <B3></B3> <B4></B4> <C>

我面临着一个相当大的问题,因为即使我正确地使用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有一个与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字符串。因此,我的目标是在类中映射整个xml字符串,该类将自动映射其属性,该属性也是字符串的xml部分。我还为每个子类中的每个属性声明了注释@Xmlelement。最后,E和C没有合适的类,因为它们分别充当D类和F类的一种分隔符,所以它们在主类a中被简单地声明为字符串


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

导入javax.xml.bind.annotation.xmlement; 导入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.xmlement

公共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.xmlement; 导入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.xmlement; 导入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.xmlement; 导入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.xmlement

公共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.xmlement

公共类别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个对象的arraylist。@可以跳过嵌套对象的XmlRootElement,因为它用作顶部(根)xml文件的级别。JAXB是一种java标准,通过它我们可以将java对象转换为xml结构。在上面的示例中,类a是顶级类,它是xml文件的根元素。对于任何xml标记,例如,我们必须定义一个类。由于类a有多个嵌套的xml标记,因此为每个标记定义多个java类。
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;
}