public class Person {
public String name; ...
}
マーサルするときに、値属性を持つ名前ノードを取得したい
<name value="arahant" />
それ以外の :
<name>arahant</name>
どうすればこれを達成できますか?XmlElementWrapper を見てみましたが、それはコレクションに対してのみ許可されています。これにはカスタム コードを記述する必要がありますか?
public class Person {
public String name; ...
}
マーサルするときに、値属性を持つ名前ノードを取得したい
<name value="arahant" />
それ以外の :
<name>arahant</name>
どうすればこれを達成できますか?XmlElementWrapper を見てみましたが、それはコレクションに対してのみ許可されています。これにはカスタム コードを記述する必要がありますか?
このユースケースをサポートするために利用できるオプションがいくつかあります。
オプション #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>