使用JAXB编组嵌套类

Geo*_*ora 8 java xml jaxb

我试图编组我设计的一些类,使用标准的JAXB,这些类都有void构造函数,这是我第一次尝试使用JAXB或编组/解组任何语言,但据我所知它JAXB应该能够编组他们没有XSD.

课程如下:

@XmlRootElement(name="place")
class Place {
    @XmlAttribute
    //various fields and get set methods
    public Place() {          
    }
}

@XmlRootElement(name="Arc")
class Arc {
    // various fields and get set methods
    @XmlAttribute
    Place p;
    public setPlace(Place p) {
        // ...
    }

    public Arc() { 
    }
}

@XmlRootElement(name="Transition")
class Transition {
   Arc[] a;

   public Transition() {        
   }
}
Run Code Online (Sandbox Code Playgroud)

我可以编组Place类而不是Arc类,Transition我甚至没有尝试过,类有@XMLPropriety标签但是当它到达嵌套Place类时,JAXB似乎也不了解映射它的XML对象.

如果有另一个标签我应该用于嵌套类,或者还有另一个我忽略的错误?

bdo*_*han 7

使用任何JAXB(JSR-222)实现来处理嵌套类都没有什么特别之处.下面是一个完整的示例,其中只使用了一个@XmlRootElement注释:

过渡

package forum13159089;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
class Transition {

    Arc[] a;

    public Arc[] getA() {
        return a;
    }

    public void setA(Arc[] a) {
        this.a = a;
    }

}
Run Code Online (Sandbox Code Playgroud)

package forum13159089;

class Arc {

    Place p;

    public Place getPlace() {
        return p;
    }

    public void setPlace(Place p) {
        this.p = p;
    }

}
Run Code Online (Sandbox Code Playgroud)

地点

package forum13159089;

class Place {

}
Run Code Online (Sandbox Code Playgroud)

演示

package forum13159089;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Transition.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum13159089/input.xml");
        Transition transition = (Transition) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(transition, System.out);
    }

}
Run Code Online (Sandbox Code Playgroud)

input.xml中/输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<transition>
    <a>
        <place/>
    </a>
    <a>
        <place/>
    </a>
</transition>
Run Code Online (Sandbox Code Playgroud)

欲获得更多信息


注意: @XMLProperty不是JAXB注释.


KSH*_*TiJ 5

这段代码对我有用.请检查.

 @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    public class First {

        @XmlElement
        private String name;
        @XmlElement
        private String surname;
        @XmlElement
        private String address;
            getters and setters
    }


    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Second {

        @XmlElement
        private String address1;
        @XmlElement
        private String address2;
        @XmlElement
        private String address3;
        @XmlElement
        private First first;
            getters and setters
    }

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Forth {

    @XmlElement
    private String address6;
    @XmlElement
    private String address7;
    @XmlElement
    private Second[] array = new Second[2];
        getters and setters
}

    public static void main(String arsg[]) throws Exception 
        {
            First first =  new First();
        first.setName("Kshitij");
        first.setSurname("Solanki");
        first.setAddress("Nadiad");

        Second second = new Second();
        second.setAddress1("Kshiutij_1");
        second.setAddress2("Kshiutij_2");
        second.setAddress3("Kshiutij_3");
        second.setFirst(first);

        Second second1 = new Second();
        second1.setAddress1("Kshiutij_1");
        second1.setAddress2("Kshiutij_2");
        second1.setAddress3("Kshiutij_3");
        second1.setFirst(first);

        Second[] arra = {second, second1};

        Forth forth = new Forth();
        forth.setAddress6("kjhgaksjfsadf");
        forth.setAddress7("sdlkfsdf");
        forth.setArray(arra);

        JAXBContext context = JAXBContext.newInstance(Forth.class);
        Marshaller marshaller = context.createMarshaller();
        StringWriter stringWriter = new StringWriter();
        marshaller.marshal(forth, stringWriter);
        System.out.println(stringWriter.toString());
        }
Run Code Online (Sandbox Code Playgroud)

对不起,如果我不明白你的问题.

  • +1 - BTW,因为JAXB是异常配置,您只需要在希望XML表示与默认值不同的地方添加注释(即,因为所有字段/属性都被视为`@ XmlElement`,所以您只需要使用该注释你想要指定一个非默认的元素名称.只需要在根对象上使用`@ XmlRootElement`.以下内容应该有所帮助:http://blog.bdoughan.com/2012/07/jaxb-no-annotations-required html的 (3认同)