私は JAXB を初めて使用するのですが、XPath 式を使用して XML を応答オブジェクトにアンマーシャリングする方法があるかどうか知りたいです。問題は、サード パーティの Web サービスを呼び出していて、受信した応答に多くの詳細が含まれていることです。XML のすべての詳細を応答オブジェクトにマップしたいわけではありません。特定の XPath 式を使用して取得できる XML からいくつかの詳細をマップし、それを応答オブジェクトにマップしたいだけです。これを実現するのに役立つ注釈はありますか?
例えば、次の応答を考えてみましょう
<root>
<record>
<id>1</id>
<name>Ian</name>
<AddressDetails>
<street> M G Road </street>
</AddressDetails>
</record>
</root>
私は通りの名前を取得することにのみ興味があるので、xpath式を使用して「root/record/AddressDetails/street」を使用して通りの値を取得し、それを応答オブジェクトにマップしたいと思います。
public class Response{
// How do i map this in jaxb, I do not wish to map record,id or name elements
String street;
//getter and setters
....
}
ありがとう
ベストアンサー1
注記:私はEclipseLink JAXB (MOXy)のリーダーでありメンバーである宇宙ステーション(JST-222)専門家グループ。
@XmlPath
このユースケースではMOXy の拡張機能を使用できます。
応答
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;
@XmlRootElement(name="root")
@XmlAccessorType(XmlAccessType.FIELD)
public class Response{
@XmlPath("record/AddressDetails/street/text()")
String street;
//getter and setters
}
jaxb.プロパティ
jaxb.properties
MOXy を JAXB プロバイダーとして使用するには、次のエントリを含む、ドメイン モデルと同じパッケージにというファイルを含める必要があります(参照:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
デモ
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Response.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum17141154/input.xml");
Response response = (Response) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(response, System.out);
}
}
出力
<?xml version="1.0" encoding="UTF-8"?>
<root>
<record>
<AddressDetails>
<street> M G Road </street>
</AddressDetails>
</record>
</root>
詳細については