8

我正在尝试使用标准 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() {        
   }
}

我可以编组Place类但不能编组Arc类,Transition我什至没有尝试过,类有@XMLPropriety标签,但是当它到达嵌套Place类时,JAXB 似乎也不明白要映射哪个 XML 对象。

如果我应该为嵌套类使用另一个标签,或者我忽略了另一个错误?

4

2 回答 2

8

使用任何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;
    }

}

package forum13159089;

class Arc {

    Place p;

    public Place getPlace() {
        return p;
    }

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

}

地方

package forum13159089;

class Place {

}

演示

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);
    }

}

输入.xml/输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<transition>
    <a>
        <place/>
    </a>
    <a>
        <place/>
    </a>
</transition>

了解更多信息


注意: @XMLProperty不是 JAXB 注释。

于 2012-10-31T15:19:53.793 回答
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());
        }

抱歉,如果我没有理解您的问题。

于 2012-10-31T13:49:41.767 回答