3
public class Person {
    public String name; ...
}

マーサルするときに、値属性を持つ名前ノードを取得したい

<name value="arahant" />

それ以外の :

<name>arahant</name>

どうすればこれを達成できますか?XmlElementWrapper を見てみましたが、それはコレクションに対してのみ許可されています。これにはカスタム コードを記述する必要がありますか?

4

1 に答える 1

4

このユースケースをサポートするために利用できるオプションがいくつかあります。


オプション #1 -XmlAdapter任意の JAXB (JSR-222) の実装

このアプローチは、JAXB (JSR-222)準拠の実装で機能します。

バリューアダプター

AnXmlAdapterを使用すると、あるオブジェクトを別のオブジェクトであるかのようにマーシャリングできます。この例では、 でマッピングされた 1 つのプロパティを持つオブジェクトとの間で値をXmlAdapter変換します。String@XmlAttribute

package forum13489697;

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

public class ValueAdapter extends XmlAdapter<ValueAdapter.Value, String>{

    public static class Value {
        @XmlAttribute
        public String value;
    }

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

    @Override
    public Value marshal(String string) throws Exception {
        Value value = new Value();
        value.value = string;
        return value;
    }

}

@XmlJavaTypeAdapter注釈は、 をフィールドまたはプロパティで使用する必要があることを指定するために使用されますXmlAdapter

package forum13489697;

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

@XmlRootElement
public class Person {

    @XmlJavaTypeAdapter(ValueAdapter.class)
    public String name;

}

オプション #2 - EclipseLink JAXB (MOXy)

私はEclipseLink JAXB (MOXy)のリーダーであり、@XmlPathパス ベースのマッピングを簡単に実行できる拡張機能を提供しています。

package forum13489697;

import javax.xml.bind.annotation.XmlRootElement;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
public class Person {

    @XmlPath("name/@value")
    public String name;

}

jaxb.properties

MOXy を JAXB プロバイダーとして指定するにはjaxb.properties、次のエントリを使用して、ドメイン モデルと同じパッケージで呼び出されるファイルを含める必要があります ( http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-asを参照)。 -your.html )。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

デモコード

次のデモ コードは、どちらのオプションでも使用できます。

デモ

package forum13489697;

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

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum13489697/input.xml");
        Person person = (Person) unmarshaller.unmarshal(xml);

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

}

input.xml/出力

<?xml version="1.0" encoding="UTF-8"?>
<person>
    <name value="arahant" />
</person>
于 2012-11-21T10:22:54.313 に答える