1

クラスの例があるとしましょう:

class Example{
  String myField;
}

私はこの方法でそれをアンマーシャリングしたい:

<Example>
  <myField value="someValue" />
</Example>

JAXB XJC を使用して、そのような方法でオブジェクトを非整列化することは可能ですか? (EclipseLinkのXmlPathについては知っていますが、使用できません)。

4

2 に答える 2

3

XmlAdapterこのユース ケースでは を活用できます。その中で、XML 属性にマップされた 1 つのプロパティを持つオブジェクトとの間でXmlAdapterを変換します。String

XmlAdapter

package forum12914382;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class MyFieldAdapter extends XmlAdapter<MyFieldAdapter.AdaptedMyField, String> {

    @Override
    public String unmarshal(AdaptedMyField v) throws Exception {
        return v.value;
    }

    @Override
    public AdaptedMyField marshal(String v) throws Exception {
        AdaptedMyField amf = new AdaptedMyField();
        amf.value = v;
        return amf;
    }

    public static class AdaptedMyField {

        @XmlAttribute
        public String value;

    }

}

package forum12914382;

import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

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

    @XmlJavaTypeAdapter(MyFieldAdapter.class)
    String myField;

}

デモ

package forum12914382;

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

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum12914382/input.xml");
        Example example = (Example) unmarshaller.unmarshal(xml);

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

}

input.xml/出力

<Example>
  <myField value="someValue" />
</Example>

関連する例

于 2012-10-16T12:30:04.777 に答える
0

はい、手動で@XmlAttribute -Annotation を追加するか、XSD からクラスを生成してください。

于 2012-10-16T12:27:08.197 に答える