Java 嵌套XML模式,如何使用JAXB?
我面临着一个相当大的问题,因为即使我正确地使用JAXB API将xml字符串映射到java对象,我也会陷入困境。 为了节省时间,我将不编写实际字段,而是编写XML的通用模式: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>
<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;
}